【C语言】关于 整数 和 浮点数 在内存中存储方式

2024-01-30 13:54:25 浏览数 (1)

整数和浮点数在内存中存储

1 整数

整型数据的储存是以补码的形式进行存储

原码 反码 补码

对于正整数的储存,三者相同 对于负整数的储存,如下: 1 0000000 00000000 00000000 00000000

首位为符号位,其余填充数据(取反 1)

-32的储存为 : 10000000 00000000 00000000 00100000(原) 111111111 111111111 111111111 11011111 (反) 111111111 111111111 111111111 11100000 (补)

不同类型的整型数据有所差异

例如32位环境下 int 占 4个字节 32个比特位 short 2个字节 16个比特位 则在储存-32时有所差异 int 类型 为 111111111 111111111 111111111 11100000 short 类型为 111111111 11100000(首位为符号位) 其他以此类推

2 浮点数

32位 状态 下
64位 状态 类似
举例来说:

⼗进制的 5.0,写成⼆进制是 101.0 ,相当于 1.01×2^2 。 那么,按照上⾯V的格式,可以得出S=0,M=1.01,E=2。 ⼗进制的 - 5.0,写成⼆进制是 -101.0 ,相当于 -1.01×2^2 。那么,S=1,M=1.01,E=2。

IEEE 754规定:

对于32位 的浮点数,最⾼的1位存储符号位S,接着的 8位 存储指数E,剩下的 23位 存储有效数字M。 对于== 64位== 的浮点数,最⾼的1位存储符号位S,接着的 11位 存储指数E,剩下的 52位 存储有效数字M。

注意
M为== size_t ==类型 M的 取值为 1.xxxxxxxxxxxxx(1 < M < 2)
IEEE 754规定:

在计算机内部保存M时,默认这个数的第⼀位总是 1,因此可以被舍去,只保存后⾯的 xxxxxx部分 。

⽐如:

保存 1.01 的时候,只保存 0 1,等到读取的时候,再把第⼀位的 1加上去。这样做的⽬的是节省 1位 有效数字。以 32位 浮点数为例,留给 M 只有 23位,将第⼀位的 1 舍去以后,等于可以保存 24位 有效数字。

3 特殊情况

M 不都为 1也 不都为 0
E全为0

这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第⼀位的 1,⽽是还原为 0.xxxxx x的⼩数。这样做是为了表⽰±0,以及接近于0的很⼩的数字。

E全为1

这时,如果有效数字M全为0,表⽰±⽆穷⼤(正负取决于符号位s);

0 人点赞