整数的存储:
计算机中的整数有三种表示方法:原码、反码、补码。整数都是用其补码存储内存中。其中正数的原反补码相同,负数的原反补需进行转换,转换规则如下:
反码是将原码的符号位不变,其余二进制位按位取反。
补码是反码的二进制位+1.。
为什么整数存储在内存中的是补码形式?
因为在进行加减法的时候,cpu只能处理加法而不能处理减法计算(cpu只有加法器),并且原码和反码转换方式相同,不需要额外的硬件电路。
大端小端的介绍:
当我们知道整数是用补码存进内存的,那它是怎么被存进内存的呢?现在我要向大家介绍一下大端存储和小端存储的概念,告诉大家它是怎么被存储进去的。
大端:低位字节序存储在内存地址的高地址处,高位字节序存储在内存地址的低地址处 。 小端:低位字节序存储在内存地址的低地址处,高位字节序存储在内存地址的高地址处。
此时我的机器的中a的值是倒着存的,低位字节序存储在内存地址的低地址处,所以是小端存储。
浮点数的存储:
根据国际标准
IEEE
(电气和电子工程协会)
754
,任意一个二进制浮点数
V
可以表示成下面的形式:
(-1)^S * M * 2^E
(-1)^S
表示符号位,当
S=0
,
V
为正数;当
S=1
,
V
为负数。
M
表示有效数字,大于等于
1
,小于
2
。
2^E
表示指数位。
先储存S,在存储E,最后存储M。
对于
32
位的浮点数,最高的
1
位是符号位
s
,接着的
8
位是指数
E
,剩下的
23
位为有效数字
M
。
对于
64
位的浮点数,最高的
1
位是符号位s,接着的
11
位是指数
E
,剩下的
52
位为有效数字
M
。
我给大家举个例子:十进制的5.0,转化成二进制就是101.0,也就是1.01*2^2,其中s=0,E=2,M=1.01。
S比较简单,当你的整数为正数时最高位存储0,当为负数时最高位存储1。
M的存储是去掉首位的1,其余数字存储到内存中,不够的位补0。读取的时候再把1加上。
E较为复杂,当你的机器为32位时,用E的真实值+127,再将得到的值转化为二进制位存储到内存中去。当你的机器为64位时,用E的真实值+1023,
再将得到的值转化为二进制位存储到内存中。
当E全为0时,它表示的数是非常非常接近于0的数字,真实值为1-127。
有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。
当E全为1时,它表示无穷大的数字。