一、数据类型介绍
1.1数据类型分类
char ; short ; int ; long ; float ; double..
类型决定开辟内存空间的大小
1.2有符号数与无符号数
有符号数前缀:signed
无符号数前缀:unsigned
如果有符号位,则首个bit位为符号位,其中1表示负数,0表示正数,其余为数值位;
如果是没有符号位,则首个bit位不单独作为符号位,均为数值位。
二、整型在内存中的存储
2.1原码、反码、补码
正数的原码、反码、补码均一致。
而负数的原码为按照正负数翻译为二进制后所得到的即为原码;原码符号位不变,其它位按位取反可得到反码;反码+1得到补码。
//-1的补码
//原码:1000 0000 0000 0000 0000 0000 0000 0001
//反码:1111 1111 1111 1111 1111 1111 1111 1110
//补码:1111 1111 1111 1111 1111 1111 1111 1111
计算机所存储的是补码。并且使用补码可以将符号位和数值位统一处理,其中加法和减法也可以统一处理。不需要额外的转换。
2.2大端,小端
大端存储模式:将数值的低位保存在内存的高地址中;高位反之。
小端存储模式:将数值的低位保存在内存的低地址中;高位反之。
例如:我们定义一个整型变量a为20,它的地址是:
0000 0000 0000 0000 0000 0000 0001 0010;
将其转为16进制(计算机储存的是16进制):
0x 00 00 00 14;
如果是大端储存,则为:00 00 00 14;
如果是小端储存,则为:14 00 00 00。
三、浮点型在内存中的储存。
3.1浮点数存储规则(IEEE754标准)
根据国际标准IEEE754,任意一个二进制浮点数可以表示为下面的形式:
(-1)^S * M *2^E
(-1)^S:符号位,如果S=0则为正数,S=1则为负数。
M:有效数字,大于等于1小于2。
2^E:指数位。
例如:
十进制的5.0:整数部分写成二进制则为:101,而小数部分则可以写为0,这里的0表示为0*1/2;
十进制的10.75:整数部分写成二进制则为:1010,而小数部分则为11.
综上:5.0 == 101.0(二进制)
10.75 == 1010.11(二进制)
总结一下,浮点数转化为二进制,整数部分正常转化,小数部分的分别为1/2的几次方+1/4的几次方+1/8的几次方+1/16的几次方.......
我们将其转化为(-1)^S * M *2^E的形式:
5.0:101.0,相当于1.01 * 2^2,则S为0,M为1.01,E=2.
10.75:1010.11,相当于1.01011 * 2^3,则S为0,M为1.01011,E=4
3.2浮点型在内存中的存储规则
我们知道,对于32位的机器,一共可以产生32个bit位的存储。其中S占用的内存位为1bit,M占用的为32bit,E占用的为8bit;这也叫单精度浮点数。
而对于64为的机器,一共可以产生64个bit位的存储。其中S占用的内存位为1bit,M占用的为52bit,E占用的为11bit。这也叫双精度浮点数。
S存入内存时只有0或1。
上文提到,M的范围为大于等于1,小于2。故此M总是可以写成1.XXXXXXXXXXXX,故此存储时默认省略1,用到时再加上1。
而对于E,如果E为8位,它的取值范围为0~255,如果E为11位,则范围为0~2047。我们知道,E是可以出现负数的。所以,E存入内存的时候,必须要在真实值的基础上加上一个中间数,对于8位的E,中间数为255/2=127;对于11位的E,中间数位2047/2=1023。
例如:
101.0存入内存时:
S:0
E:2+127=129
M: 01
故此存入内存时候为:
0 1000 0001 0000 0000 0000 0000 0000 001
1010.11存入内存时:
S:0
E:4+127=131
M:01011
故此写入内存时候为:
0 1000 0011 0000 0000 0000 0000 0001 011
3.3指数E从内存中取出的三种情况
3.3.1 E不全为0或不全为1
按照规则,指数E的数值减去127(32位),得到真实值,再将M前面加上1.即可。
3.3.2 E全为0
这时候,浮点数的指数E等于1-127 = -126为真实值(32位),1-1017=-1026为真实值(64位)
M就不再加上1.(因为太小了),直接还原为0.xxxxxxxxxx的小数。
3.3.3 E全为1
如果M全为0,表示无穷大
644

被折叠的 条评论
为什么被折叠?



