【问题标题】:Why is 0x00000100 = 256?为什么 0x00000100 = 256?
【发布时间】:2013-12-04 20:21:09
【问题描述】:

不应该是 0x00000100 = 4。

我知道从 2^0 开始 0x00000001 = 1,从 2^1 开始 0x00000010 = 2。我的想法有什么问题?

initVariable(&variable1, "variable1", "1, 2, 3", 0x00000100);

assertIntegerEquals(variable1.address, 4); // 0x00000100 = 4?

我的断言失败了,因为它说 256 != 4

【问题讨论】:

  • 0x 是通常用于十六进制 (base-16) 数字的前缀,而不是二进制 (base-2)。此外,0x00000010 是 16,因为 16^1。
  • 不应该是 0000 0100 = 8 和 0000 0010 = 4
  • @jonnh,00000100 是 8。但是 OP 说的是十六进制:0x00000010 是 16,而不是 2。
  • 8,我的意思是 4. 0001 = 1, 0010 = 2, 0100 = 4, 1000 = 8. :)
  • @alk,是的,用于八进制解释。我的观点是:OP 问题中的数字显示为十六进制,但他解释为二进制。

标签: c binary


【解决方案1】:

0x 开头的数字在 C 中被解释为十六进制(以 16 为基数)。

所以0x10 == 160x100 == 2560x10000 == 65536

二的幂是:

  • 20 = 0x1
  • 21 = 0x2
  • 22 = 0x4
  • 23 = 0x8
  • 24 = 0x10
  • 25 = 0x20
  • 26 = 0x40
  • 27 = 0x80
  • 28 = 0x100

【讨论】:

    【解决方案2】:

    不,0x 表示十六进制(即 base-16)而不是二进制,您似乎对此感到困惑。

    如果您想在代码中使用二进制文字,请参阅this SO question,其中提到了允许使用0b00000100 以二进制形式表示4 的gcc 扩展。

    【讨论】:

      【解决方案3】:

      0x00000100 是 base-16,因为 0x 前缀表示您使用的是十六进制表示法。

      所以0x00000001 = 1*160 = 1, 0x00000010 = 1*161, 0x00000100 = 1*162 = 256 和 0x00000123 = 1*162 + 2*161 + 3*160 = 256 + 32 + 3 = 291

      要使用 base-2、base-10 和 base-16 表示法,您可以试试这个网站:http://www.mathsisfun.com/binary-decimal-hexadecimal-converter.html

      【讨论】:

      • 这确实是一个不错的答案。
      【解决方案4】:

      0x 前缀表示hexadecimal

      【讨论】:

        【解决方案5】:

        0x00000100(十六进制)= 0000 0000 0000 0000 0000 0001 0000 0000(二进制)= 256(十进制)

        【讨论】:

          【解决方案6】:

          0x前缀是十六进制0x00000100 = 256 base 16

          00000100 = 00000120100

          = 1 * 162 + 0*161 + 0*0

          =1 * 256 + 0*16 + 0*1

          = 256 + 0 + 0

          =256

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-01-09
            • 2017-03-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-07-30
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多