本文结构:
a、解释float位模式
b、解释double位模式
c、简单比较
a、在C语言中,float
类型的存储位模式图可以如下表示:
[31] [30-23] [22-0]
S EEEEEEE MMMMMMMMMMMMMMMMMMM
[31]
:最高位是符号位(S),用于表示浮点数的正负。0 表示正数,1 表示负数。[30-23]
:接下来的 8 位是指数位(E),用于表示浮点数的指数部分。这些位表示的是一个无符号整数,通过偏移(bias)来映射实际的指数值。对于float
类型,偏移量是 127。[22-0]
:最低的 23 位是尾数位(M),用于表示浮点数的有效数字(mantissa)部分。尾数部分隐含了一个最高位的 1(不在 23 位中显式表示),所以实际上可以表示 24 位的有效数字。
一个具体的例子,假设我们有一个 float
类型的变量 f
,其内存中的二进制表示如下:
0 10000010 10010010000101000010010
我们可以按照位模式图来解释这个表示:
- 符号位(S)是
0
,表示这是一个正数。 - 指数位(E)是
10000010
,对应的十进制数是130
。由于float
的指数偏移量是127
,所以实际的指数值是130 - 127 = 3
。 - 尾数位(M)是
10010010000101000010010
,这是有效数字部分的二进制表示。注意,这里隐含了一个最高位的 1,所以完整的尾数表示是1.10010010000101000010010
。
通过解释这些位,我们可以得到 float
变量 f
的近似十进制表示。
b、在C语言中,double
类型的存储位模式图可以如下表示:
[63] [62-52] [51-0]
S EEEEEEEEEEEEE MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
[63]
:最高位是符号位(S),用于表示浮点数的正负。0 表示正数,1 表示负数。[62-52]
:接下来的 11 位是指数位(E),用于表示浮点数的指数部分。这些位表示的是一个无符号整数,通过偏移(bias)来映射实际的指数值。对于double
类型,偏移量是 1023。[51-0]
:最低的 52 位是尾数位(M),用于表示浮点数的有效数字(mantissa)部分。与float
类型类似,double
类型的尾数部分隐含了一个最高位的 1,所以实际上可以表示 53 位的有效数字。
一个具体的例子,假设我们有一个 double
类型的变量 d
,其内存中的二进制表示如下:
0 10000000100 1001001000010100001001000000000000000000000000000000
我们可以按照位模式图来解释这个表示:
- 符号位(S)是
0
,表示这是一个正数。 - 指数位(E)是
10000000100
,对应的十进制数是1028
。由于double
的指数偏移量是1023
,所以实际的指数值是1028 - 1023 = 5
。 - 尾数位(M)是
1001001000010100001001000000000000000000000000000000
,这是有效数字部分的二进制表示。注意,这里隐含了一个最高位的 1,所以完整的尾数表示是1.100100100001010000100100000000000000000000000000000
。
c、通过解释这些位,我们可以得到 double
变量 d
的近似十进制表示。由于 double
类型有更高的位数来表示指数和尾数,因此它可以提供比 float
类型更高的精度和更大的数值范围。