C语言数据类型——float vs double

本文结构:

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 类型更高的精度和更大的数值范围。

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值