1、整形在内存的存储:
整形有short、int、long、longlong类型。
整数的二进制的表示方式有三种:源码,反码,补码。
三种表示方式均由符号位和数值位组成,符号位中1表示负,0表示正,有符号整形中最高位为符号位,其余为数值位,无符号整形均表示数值位。
正数的源码、反码、补码相同
eg: int 10
源码:00000000 00000000 00000000 00001010
反码:00000000 00000000 00000000 00001010
补码:00000000 00000000 00000000 00001010
负数的源码、反码、补码不同,但有联系。
源码:将负数转化为二进制表示,最高位符号位为1。
反码:源码符号位不变,数值位按位取反。
补码:由源码符号位不变数值位取反加1,或者由反码直接加1。
eg: int -7
源码:10000000 00000000 00000000 00000111
反码:11111111 11111111 11111111 11111000
补码:11111111 11111111 11111111 11111001
对于整数来说,在内存中存储的是补码。
2、大小端存储
不难看出0x12345678这个数字按着倒序储存,这是什么原因呢?
2.1、什么是大小端存储
当存储的数超过一个字节时,就会有存储顺序,按照不同的存储顺序,将其分为大端字节序存储和小端字节序存储。
⼤端(存储)模式:是指数据的低位字节内容保存在内存的⾼地址处,⽽数据的⾼位字节内容,保存 在内存的低地址处。
⼩端(存储)模式:是指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存 在内存的⾼地址处。
以下为我个人分辨大小端存储的方式:
大端存储:将数据高位字节的内容存储在内存低地址处。
小段存储:将数据低位字节的内容存储在内存低地址处。
3、浮点数在内存的存储
3.1、引例
常⻅的浮点数:3.141592、1E10等,浮点数家族包括: float、double、long double 类型。
这个代码的输出结果为:
那么为什么第二行结果为0.000000,第三行结果为1091567616呢?
3.2、浮点数的存储:
要想理解这个结果,首先应该知道浮点数如何在计算机内部存储。
根据国际标准IEEE(电⽓和电⼦⼯程协会) 754,任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式:
S 表⽰符号位,当S=0,V为正数;当S=1,V为负数
M 表⽰有效数字,M是⼤于等于1,⼩于2的
表⽰指数位
eg:
eg1:十进制的7.0为111.0,相当于
按照上面的格式S = 0,M = 1.11,E = 2,
eg2:十进制的5.5为101.1,相当于
按照上面的格式S = 0,M = 1.011,E = 2,
eg3:十进制的0.5为0.1,相当于
按照上面的格式S = 0,M = 1,E = -1。
IEEE 754规定:
对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M
3.2.1浮点数存储过程
EEE 754 对有效数字M和指数E,还有⼀些特别规定。
M应该大于等于1并且小于2,M可以写为1.xxxxxx的形式,其中xxxxxx表示小数部分。
IEEE 754规定,在计算机内部保存M时,默认这个数第一位总是1,因此可以舍去,只保存后面xxxxxx部分。比如保存1.1011时,只保存1011,等到读取时,自动吧第一位1加上去。这样做相当于节省1位有效数字。以64位浮点数为例留给M只有52位,将第一位1舍去后,等价于保存53位有效数字。
对于指数E
首先,E为一个无符号整形
这意味着,如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0~2047.但是
由3.2的eg3可以知道E是可以出现负数的,所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。eg:的E是3,所以保存成32位浮点数时,必须保存为3+127 = 130,即10000011。
3.2.2 浮点数取的过程 指数E从内存中取出还可以再分成三种情况:
E不全为0或不全为1
eg :0.5相当于,S = 0,M = 1.0,E = -1。-1+127(中间数) = 126。尾数1.0去掉整数1应当补23个0。
其二进制表示方式为:
0 01111110 0000000000000000000000
E全为0
这时浮点数指数部分E为-127,若将整数部分后移一位指数部分变为1-127,M将变为0.xxxxxx的小数,此时趋近于0。
0 00000000 00100000000000000000000
E全为1
这时浮点数指数部分E为128,趋近于无穷大。
0 11111111 00010000000000000000000
关于浮点数的表示规则介绍到这里。
3.2.3、引例题解
现在已经了解了浮点数计算机存储的方式,解决一下开头的例子。
首先整形num=9
所以num的二进制表示为:00000000 00000000 00000000 00001001
以float类型浮点数的方式读取:0 00000000 000000000000000000001001
读取出来指数部分全是0,为3.2.2E全为0类型,则应该为无穷小0。
将其指针解引用赋值为9.0,即,E = 3,M为1.001,E部分加上127为130,M部分省略整数部分011。
其二进制表示方式为:0 10000010 00100000000000000000000
整形读取为:01000001 00010000 00000000 00000000