目录
20 数据的机器级表示
20.1 补码讲解及内存实战
补码:原码取反加一。表示负数。CPU中的内存地址是32位的。以2+(-5)举例:当最高位为1(代表负数)时,要得到原码才能知道0xfffffffd的值,即对其取反后加1得到3,所以其值为−3。
#include <stdio.h> |
小端法存储在内存中:
反码
正数的反码和原码一样;负数的反码就是在原码的基础上符号位保持不变,其他位取反。
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> |
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> |
调试结果:
可以看出a在赋值之后的结果就发生了精度丢失。解决办法就是将值存储在更大的精度中比如double类型中。
另外针对强制类型转换,int转float可能造成精度丢失,因为int是有10位有效数字的,但是int强制转为double不会,float转为double也不会丢失精度。
20.5 选择题真题