【问题标题】:Binary representation of data types in CC中数据类型的二进制表示
【发布时间】:2013-12-08 14:25:06
【问题描述】:

如果我在 C 中有一个普通的 32 位 int,那么这个数字在内存中是如何表示的?具体来说,符号是如何存储的?

起初我以为它是符号和幅度,但后来我记得会有 + 和 - 0,所以我认为它可以存储在二进制补码中,但是当使用二进制补码时,我最终得到最大值4294967293,MSB 设置为 0(我通过总结从 2^31 到 2^0 的所有内容得到这个值),众所周知这是错误的。

【问题讨论】:

  • 这实际上是实现定义的。但二进制补码可能是当今使用最广泛的。
  • 您可能想了解Two's complement
  • @mbratch 不在有符号表示中(既不是二进制补码也不是符号大小)。最大的 unsigned 32 位整数确实是2^32-1,但那是完全不同的事情。
  • @delnan 哎呀,是的,对不起,我有点跑题了。我应该说31^1-12^0 + ... + 2^30的总和。

标签: c binary integer twos-complement


【解决方案1】:

C 标准不强制要求二进制补码,但它是迄今为止最常见的选项(我认为即使这是轻描淡写)。你得到一个 40 亿的东西,而不是正确的 INT_MAX 的原因是一个错误的错误:你也添加了第 32 位。 231 是 MSB 的值(因为 LSB 的值是 20),所以正确的值是 sum 20 + 。 .. + 230 = 231-1.

【讨论】:

    【解决方案2】:

    即使这是实现定义的,大多数机器使用二进制补码。

    问题是你的计算是错误的。将 2^0 与 2^31 相加(顺便说一下,即 2^32 - 1)意味着您使用 32 位。这是不正确的:实际数字只使用了 31 位。 MSB 有一个特殊的含义,它与符号有关(不是真正的“符号”)。所以,你需要从 2^0 到 2^30 相加(即 2^31 - 1)。

    【讨论】:

      猜你喜欢
      • 2012-03-24
      • 2012-05-19
      • 2016-02-20
      • 2014-11-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-31
      • 2022-01-14
      • 2014-09-20
      相关资源
      最近更新 更多