整数在内存中的存储
众所周知,整数在内存中占4个字节,而一个字节由8个比特位组成,因此一个整数在内存中占32个比特位。并且整数在内存中存储是以二进制的补码的形式储存的。
二进制的原码,反码,补码:
在二进制中直接将数据翻译为二进制存在内存中的称为原码,其中第一位被称为符号位,0表示正整数,1表示负数。反码是将原码符号位不变,其他位按位取反,补码则是将反码加1。注意内存中储存的并非原码而是补码,如果将内存中的补码变为原码,给他们取反加1或减都可以变为原码,
int a = -1;
10000000 00000000 00000000 00000001 原码
11111111 11111111 11111111 11111110 反码
11111111 11111111 11111111 11111111 补码
如图 整数-1的原码,反码,补码。
大端存储模式和小端存储模式
在一块内存中位置有低有高,高的一端被称为高地址,低的一端被称为低地址,如图。
二进制中将整数分为四个字节,左边为高位,右边为低位如下图所示:00 为高位,11 为低位。
将整数的低位存在内存的低地址中,高位存在高地址中,我们称为小端字节序,而高位存在低地址中,低位存在高地址中,被称为小端字节序。
浮点数表达方式
浮点数与整数的存储方式截然不同,根据国际标准,任意一个二进制数都可以表示成下面的形式:
V=(-1)^s*M*2^E.
(-1)^s表示符号位,当s=0,V为正数,当s=1时V为负数。
M表示有效数字,大于1,小于2。
2^E表示指数位。
例如 5.5我们可以表示为 (-1)^0*1.011*2^2.其中s=0,M=1.011,E=2。
浮点数在内存中的存储
浮点数的存储其实就是S,M,E的存储,不同类型的浮点数存储大小不同。
对于float类型来说,它具有32位,最高的一位储存s,接着8位储存E,剩下的23位储存M。
对于double类型来说,它具有64位,最高的一位储存s,接着11位储存E,剩下的52位储存M。
在内存中规定E的值在float类形下加上127double类型时加上1023,才能存储,因M的值小数点前都为1,所以1可以省略只写小数点后的值,数据取出时给E减127或1023,再给M加1即可。
float a=5.5;
则可以写成 0 01000000 10110000000000000000000
s E M
当 E全为0时
真正的E=0-127=-127,有效数字M不在加1,这时浮点数无限接近于0。
0 0000000000 1011000000000000000000
当E全1时,M全为0
0 111111111111 0000000000000000000000
这时数字无穷大。
可能出现的问题
尽管计算机能够准确表示大多数整数和浮点数,但在进行数值运算时可能会出现精度丢失的问题。这是由于某些浮点数无法用有限的二进制小数表示形式精确表示而导致的。
在程序设计时,我们需要注意避免数值溢出和精度丢失的问题,可以通过合理选择数据类型、避免连续浮点运算、使用高精度计算库等方法来尽量减少这些问题的发生。
总结
总的来说,了解整数及浮点数在内存中的存储方式是非常重要的,它可以帮助我们更好地理解计算机是如何处理数值数据的,并且在编写程序时能够更加准确地控制数值计算的精度和准确性。