【高级阶段】第20章 数据的机器级表示

2023-11-08

目录

20 数据的机器级表示

20.1 补码讲解及内存实战

20.2 整型类型溢出解析

20.2.1 整型不同类型

20.2.2 整数型溢出解析

20.3 浮点数IEEE754标准解析及实战计算演示

20.4 浮点数精度丢失实战演示

20.4.1 浮点型变量的数值范围及精度*

20.4.2 浮点数精度丢失

20.5 选择题真题

20 数据的机器级表示

20.1 补码讲解及内存实战

补码:原码取反加一。表示负数。CPU中的内存地址是32位的。以2+(-5)举例:当最高位为1(代表负数)时,要得到原码才能知道0xfffffffd的值,即对其取反后加1得到3,所以其值为−3。

#include <stdio.h>

int main(){
    int i,j,k;
    i=2;
    j=-5;
    k=i+j;
    printf("%d",k);
    return 0;
}

小端法存储在内存中:

 

反码

正数的反码和原码一样;负数的反码就是在原码的基础上符号位保持不变,其他位取反。

 

20.2 整型类型溢出解析

20.2.1 整型不同类型

 

整型变量包括6种类型,类型长度也不同,各长度的范围也不同,以short类型为例:

 

有符号和无符号的short类型能够表示的最大数范围

有符号的short类型的最小的数:1000 0000 0000 0000   ---   -32768。

有符号的short类型的最大的数:0111 1111 1111 1111   ---   32767。

以此类推,各类数据类型的范围如下:

类型说明符

占用的内存空间

整型数范围

int

4字节

-231 ~ 231-1

short

2字节

-32768~32767 【-215 ~ 215-1】

long

4字节/x86;8字节/x64

-231 ~ 231-1 或 -263 ~ 263-1

unsigned int

4字节

0 ~ 232-1

unsigned short

2字节

0~65535 【0 ~ 216-1】

unsigned long

4字节/x86;8字节/x64

0 ~ 232-1 或 0 ~ 264-1

20.2.2 整数型溢出解析

超过最大范围就会发生溢出,如果发生溢出,则需要将数存储在更大的空间中。比如若超过short类型范围,可以将变量的值存储在int类型中,int存储在double中。

#include <stdio.h>

int main() {
    int i;
    short a = 32767;//最高也只有32767
    short b;
    b = a + 1;//如果存储在同类型的b中一定会发生溢出
    i = a + 1;//解决溢出的办法就是将a的值存储在更大的空间中
    printf("b = a + 1 = %d\n", b);
    printf("i = a + 1 = %d\n", i);
    printf("--------------\n");
    //下面是无符号数
    unsigned short n = 0x8056;//无符号类型,最高位不认为是符号位
    b = 0x8056;//1000 0000 0101 0110  --- 328554(无符号)
    //0111 1111 1010 1010  --- 32682
    printf("b=%d\n", b);//b是有符号类型,所以输出是负值
    printf("n=%u\n", n);//无符号类型要用%u,用%d是不规范的
    return 0;
}

20.3 浮点数IEEE754标准解析及实战计算演示

使用float关键字或double关键字定义浮点型变量。

类型

float

double

占用的内存空间

4字节

8字节

与整型数据的存储方式不同,浮点型数据是按照指数形式存储的。IEEE-754浮点型变量存储标准如下:

 

IEEE-754浮点型变量存储标准

IEEE-754的规定:

指数部分的值只能是1~254,不能是全0,全1。指数部分运算前都要减去127,因为还要表示负指数。

小数部分的底数左边省略存储一个1。

【例题1】:

S

阶码

尾数

0

10000001

0010 0000 0000 0000 0000 000

也可以变成如下形式:

浮点数4.5的存储结果

格式

SEEEEEEE

EMMMMMMM

MMMMMMMM

MMMMMMMM

二进制数

01000000

10010000

00000000

00000000

十六进制数

40

90

00

00

S:0,表示正数。

E:10000001 --- 129(十进制),129-127=2,表示2的2次幂。

M:0010 0000 0000 0000 0000 000,实际是1.0010 0000 0000 0000 0000 000 --- 1.125(.001---2-3=0.125)。

最终结果:1.125 × 22 = 4.5。

【例题2】:

 

f1 = 1.456在内存中存储的值是:1.45599997,十六进制:0x3fba5e35,转化为二进制也就是:0011 1111 1011 1010 0101 1110 0011 0101。

浮点数1.456的存储结果

格式

SEEEEEEE

EMMMMMMM

MMMMMMMM

MMMMMMMM

二进制数

001111111

10111010

01011110

00110101

十六进制数

3f

ba

5e

35

S=0;

E=0111 1111 --- 127; //2E-127=20。

M=1.011 1010 0101 1110 0011 0101。20+2-2+2-3+2-4+2-6+... 近似一个浮点数

最终结果:≈1.45599997。

20.4 浮点数精度丢失实战演示

20.4.1 浮点型变量的数值范围及精度*

类型说明符

位数

数值范围

有效数字(精度)

float

32(4字节)

10-37 ~ 1038【2-126 ~ 2127

6~7位(指十进制的)

double

64位(8字节)

10-307 ~ 10308【2-1022 ~ 21023】

15~16位(指十进制的)

float类型说明:

数值范围是2-126 ~ 2127:因为在IEEE-754标准中,指数部分的范围1 ~ 254,并且指数部分运算前都要减去127,也就是1-127 ~ 254-127,最终得到的幂的范围是:-126 ~ 127。

有效数字是6~7位:23位的小数部分表示的是223=8,388,608,有7位,因此,化得净的有效数字是7位,化不净的有效数字是6位,因为最后一位有舍入误差

20.4.2 浮点数精度丢失

【例】:验证精度丢失现象的程序

#include <stdio.h>

int main() {
    float a = 1.23456789e10; //正常a = 12345678900
    float b;
    b = a + 20;//正常b = 12345678920
    printf(" b = a + 20 = %f\n", b); //但结果是 1.23456788e+10
    return 0;
}

调试结果:

 

可以看出a在赋值之后的结果就发生了精度丢失。解决办法就是将值存储在更大的精度中比如double类型中。

另外针对强制类型转换,int转float可能造成精度丢失,因为int是有10位有效数字的,但是int强制转为double不会,float转为double也不会丢失精度。

20.5 选择题真题

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【高级阶段】第20章 数据的机器级表示 的相关文章

随机推荐

  • Ceph集群生产环境安装部署

    前言 ceph的组件以及工作流程非常的复杂 是一个庞大的系统 在尝试ceph之前尽量多查阅官方的文档 理解ceph的mon osd mds pg pool等各组件 Unit的协同工作方式 Ceph官方文档 一 配置规划 二 部署 1 ntp
  • 超强OCR文字识别软件 图像文字识别软件工具-独有直接屏幕截图识别功能

    原文地址 http blog sina com cn s blog 4d36b4ba0100vnzc html 相关文章 1 Screen OCR 屏幕画面截屏工具 13 5 官方绿色版 http www newasp net soft 6
  • 人的一生(none)

    曾仕强 情绪管理 要有理想 情绪负债 享受错误的决定 错误嘴巴推给别人心里推给自己 没有人会因为你的抱怨而改变 只有改变自己 立场不同 讲话不一样 反求诸己 治标方法 散步 发泄 要看开 不要看破 被看待事情的观点所困扰 而不是被事情所困扰
  • linux 系统命令行查看电池剩余电量

    proc acpi battery BAT0 state 文件里的remaining capacity表示剩余电量 proc acpi battery BAT0 info 文件里的last full capacity表示满电量 如果有多块电
  • python数据分析——pyecharts折线图全解(小白必看)

    折线图是排列在工作表的列或行中的数据可以绘制到折线图中 折线图可以显示随时间 根据常用比例设置 而变化的连续数据 因此非常适用于显示在相等时间间隔下数据的趋势 下面我给大家介绍一下如何用pyecharts画出各种折线图 1 基本折线图 im
  • 【WSL2】win11创建秒级启动openEuler虚拟机

    前言 Windows上安装openEuler虚拟机 现在大多采用的是 vmware workstation virtual box 方案 可以完整地体验openEuler系统以及使用图形界面 这个方案的缺点是启动慢 资源消耗大 性能损耗大
  • VMware虚拟机安装+Ubuntu安装+VMware Tools安装+Ubuntu下g++编译器的安装+虚拟机中系统的移动

    一 VMware虚拟机安装 Ubuntu安装 本人VMware15 Pro Ubuntu18 04 06 LTS 该部分安装可见博客 提示 VMware15 Pro可在win7及以上系统中安装 VMware Workstation 16 P
  • Libevent使用例子,从简单到复杂

    出处 http blog csdn net luotuo44 article details 39670221 本文从简单到复杂 展示如何使用libevent 网上的许多例子都是只有服务器端的 本文里面客户端和服务器端都有 以飨读者 关于l
  • 3-rospy介绍

    Client Library 1 提供ROS编程的库 2 例如建立node 发布消息 调用服务 3 提供了如下几种client library roscpp rospy roslisp rospy的组成 1 Node 2 Topic 3 S
  • vscode编译多文件的方法(C和C++通用)

    vscode编译多文件的方法 1 新建一个文件夹作为工程 我这里以struct为工程文件夹 其中 xixi c 和 xixi h 是该工程下list文件夹里的内容 xixi c include xixi h include
  • 简单注册界面

    register html div class form container div
  • webpack 转换 ES6高级语法 bable插件 module rules

    在webpack中只能处理一部分es6语法 一些高级的ES6或者ES7 webpack处理不了 借助第三方loader处理 会将结果打包到main js loader 通过Bable可以转换 webpack中运行 如下两套命令 去安装bab
  • Go分布式缓存 使用 Protobuf 通信(day7)

    Go分布式缓存 使用 Protobuf 通信 day7 为什么要使用 protobuf 使用 protobuf 进行节点间通信 编码报文 提高效率 代码约50行 1 为什么要使用 protobuf protobuf 即 Protocol B
  • c语言之输出

    c语言之输出 1 printf 功能 格式化输出函数 一般用于向标准输出设备按照规定的格式输出信息 头文件
  • java hasnextstring_Java – ListIterator和hasNext

    如果列表只有一个元素 那就更清楚了 让我们说 b hasNext 实际上会返回true 而next 会读取它 迭代将在此之后结束 说明 如果你打电话给Iterator lt Object gt 任何非空列表上的it list iterato
  • flutter 左右循环跑马灯,html实现

    import dart async import package flutter cupertino dart import package flutter material dart import package flutter html
  • js数组去重的方法

    Js数组去重的方法 1 ES6 Set方法去重 1 利用ES6 Set去重 let arr 1 2 3 25 4 1 2 3 function deduplicationBySet array return Array from new S
  • 半个小时内,用神经网络识别无人机航拍图像

    上一篇只要九分钟 用神经网络构建人脸比对模型的文章发出去之后 承蒙大家厚爱 得到了不少反馈 不少朋友希望能让我讲讲如何做图像识别 正好 TeguCV 的安装包里有一个测试数据集是我们用无人机航拍的车辆照片 就用它来做个教程吧 前情提要 Ma
  • Spring之启动过程源码解析

    Spring创建Bean 会经过一系列生命周期的流程 而Spring启动 其实就是为了后续创建Bean做一些准备工作 本篇以及下一篇文章都是来详细分析Spring的启动过程 目录 一 Spring启动的大致流程 二 Spring加载流程之A
  • 【高级阶段】第20章 数据的机器级表示

    目录 20 数据的机器级表示 20 1 补码讲解及内存实战 20 2 整型类型溢出解析 20 2 1 整型不同类型 20 2 2 整数型溢出解析 20 3 浮点数IEEE754标准解析及实战计算演示 20 4 浮点数精度丢失实战演示 20