为什么0x00000100等于256?

7
0x00000100 应该等于 256 而不是 4。我知道 0x00000001 等于 1,因为 2^0,0x00000010 等于 2,因为 2^1。我的想法有什么问题吗?
initVariable(&variable1, "variable1", "1, 2, 3", 0x00000100);

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

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


11
"0x"通常是表示十六进制(即基数为16)数字的前缀,而不是二进制数字(基数为2)。另外,0x00000010代表十六进制中的16,因为16的1次方等于16。 - Daniel Kamil Kozar
@jonnh,00000100是8。但是OP在谈论十六进制:0x00000010是16,而不是2。 - Joe
1
而当我说8时,实际上是4。0001 = 1,0010 = 2,0100 = 4,1000 = 8。 :) - Joe
@Joe:再次强调,在C语言中,0010表示的是80100表示的是64,而1000表示的是1000,同样适用于1 - alk
1
@alk,是的,针对八进制解释。我的观点是:OP问题中显示的数字为十六进制,但他正在解释为二进制。 - Joe
显示剩余3条评论
6个回答

29

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

所以0x10等于160x100等于2560x10000等于65536,以此类推。

二的幂次方为:

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

11
不,"0x" 表示十六进制(即基于16)而非二进制,这似乎是你所混淆的。
如果你想在代码中使用二进制字面量,请参见 此 SO 问题,其中提到了gcc扩展,允许使用 "0b00000100" 表示二进制中的 "4"。

8
0x00000100 是16进制,因为前缀 0x 表示使用16进制表示法。所以,0x00000001 = 1*160 = 1,0x00000010 = 1*161 = 16,0x00000100 = 1*162 = 256,0x00000123 = 1*162 + 2*161 + 3*160 = 256 + 32 + 3 = 291。如果想要体验基于2、10和16的表示法,可以尝试访问该网站:http://www.mathsisfun.com/binary-decimal-hexadecimal-converter.html

那确实是一个很好的答案。 - cafebabe1991

6

3

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


(说明:这段内容是关于数字的转换,其中0x表示十六进制,binary表示二进制,decimal表示十进制。)

1

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

00000100 = 00000120100

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

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

= 256 + 0 + 0

=256


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接