目录
1. 整形在内存中的存储
1.1 原码、反码、补码
计算机中的整数有3种2进制的表达方式,即原码、反码和补码。
其中,三种码的第一位均为符号位,0表示正数,1表示负数。如果整形为无符号数(unsigned)则没有符号位。
正数的原码、反码和补码相同。
例如:
26的2进制数为 00011010
由于是正数,因此它的原码、反码和补码都是 00011010
负数的原码、反码和补码均不同
原码
将数值按正负数的形式翻译成2进制就可以得到原码
例如:
-1的原码为 10000001
第一位为符号位,是1则为负数。
反码
将原码的符号位不变,其他位按位取反就可以得到反码
例如:
-1
原码: 10000001
反码: 11111110
补码
将反码+1就可以得到补码
例如:
-1
反码:11111110
补码:11111111
这里有一种可以直接读取补码的方法:
即把符号位当做该权重的负数,例如在8bit下,符号位可以读作-128,然后依次加上前面的值。
对于整形来说:数据存放在内存中的其实是补码
在计算机系统中,数值一律使用补码的形式来表示和存储。因为使用补码可以将符号位和数值域统一处理。
加上CPU只有加法器,储存补码令运算过程相同,不需要额外的电路。
在负数的补码中也可以同时做到取反再+1得到负数的原码。
-1
补码:11111111
反码:10000000
原码:10000001
1.2 大小端介绍
什么是大小端:
大端存储模式:指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
小端存储模式:指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中;
从图中可以看到在内存中的存储是反过来的,即是小端存储模式。
每个数据以字节为单位将低位保存在低地址。
2. 浮点型在内存中的存储
2.1 浮点数存储规则
根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数V可以用下面的形式来表示:
- (-1)^S * M * 2^E
- (-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。
- M表示有效数字,大于等于1,小于2.
- 2^E表示指数位
IEEE 754规定:
对于32位浮点数(单精度浮点数),最高的1位是符号位S,接着的8位是指数位E,剩下的23位为有效数字M。
对于64位浮点数(双精度浮点数),最高的1位是符号位S,接着的11位是指数位E,剩下的52位为有效数字M。
IEEE 754对有效数字M和指数E,还有一些特别规定
前面说过,M是大于等于1及小于2的数,因此M可以写成 1.xxxx 的形式,其中 xxxx 表示小数部分。
IEEE 754规定,在计算机内部保存M是,默认将第一位数舍去,到读取数据时再加上整数部分
的1。只保存后面的小数部分,这样做可以节省1位有效数字。以32位浮点数为例,留给M只有23位,若将第一位的1舍去后,可以保存24位有效数字。
2.2 关于指数E
E为一个无符号数(unsigned int)
当E为8位,它的取值范围为0~255;当E为11位,它的取值范围为0~2047。但是,科学计数法中的E是可以为负数的,所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数为127;对于11位的E,这个中间数为1023。
例如:
2^5的E是5,所以保存成32位浮点数时,应为5+127=132,即10000100。
E在内存中取出还可以分出3中情况:
E不全为0或不全为1
此时的浮点数采用下面的规则表示,即指数E的计算式减去127(或1023),得到真实值,再在有效数字M前加上第一位的1。
例如:
E全为0
此时的浮点数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第一位的1,而是还原成0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的数字。
E全为1
此时,如果有效数字M全为0,表示±无穷大;