(本文使用的编译器为小端存储编译器,内存显示为4列)
一、整数在内存中的存储
(一)无符号整数
无符号整数在内存中的存储很简单,就是将输入的数据直接转换为二进制进行存储。
例如存储数据19:
转换为二进制序列为:
0000 0000 0000 0000 0000 0000 0001 0011
此序列就是在内存中的存储结果
(实践)二进制转换为16进制,再通过小端存储方式显示:
存储数据10086:
转换为二进制序列为:
0000 0000 0000 0000 0010 0111 0110 0110
此序列就是在内存中的存储结果
(实践)二进制转换为16进制,再通过小端存储方式显示:
(二)有符号整数
有符号整数在内存中以二进制补码的形式储存,而我们输入的数据直接转化为二进制实际上得到的是二进制原码,所以此处把正数和负数分开讨论
1.正数
原码反码补码相同,存储方式与无符号整数完全相同,但是二进制第一位是符号位0,存储的数值范围比无符号整数小。
2.负数
原码符号位不变,其他位取反得到反码,反码+1得到补码,
例如存储-4
原码:1000 0000 0000 0000 0000 0000 0000 0100
反码:1111 1111 1111 1111 1111 1111 1111 1011
补码:1111 1111 1111 1111 1111 1111 1111 1100
其中1111 1111 1111 1111 1111 1111 1111 1100就是其在内存中的存储结果
(实践)二进制转换为16进制,再通过小端存储方式显示:
二、浮点数在内存中的存储
浮点数在内存中的存储依托于科学计数法,与整数在内存中的存储截然不同
IEEE规定标准754对浮点数在内存中的存储进行了规定,任何一个二进制浮点数可以写成以下格式
其中S控制符号位
M表示有效数字,其值介于1和2之间
2^E表示指数位,E就是二进制数M小数点挪动使自身介于1到2之间的位数(科学计数法)
(一)32位float类型
float类型占用4字节,即32个bit位
1位储存S,8位存储E,23位存储M
1.存S
没什么好说的,0为正,1为负
2.存E
E为8位,取值在0-255之间,此处需要将E加上中间值127(因为E可以有负数,所以为了平衡这一问题,E需要加上中间值)再转换为二进制
3.存M
将M前面的整数1忽略,只存1小数点后面的后面的数
(二)64位double类型
1.存S
没什么好说的,0为正,1为负
2.存E
E为11位,取值在0-2047之间,此处需要将E加上中间值1023(因为E可以有负数,所以为了平衡这一问题,E需要加上中间值)再转换为二进制
3.存M
将M前面的整数1忽略,只存1小数点后面的后面的数
(三)例题:
float存储数据5.5
首先转化为二进制101.1
由此判断
S=0
M=1.011
E=2
因此可以确定存储为
0 10000001 01100000000000000000000
(实践)二进制转换为16进制,再通过小端存储方式显示: