Почему 0x00000100 = 256?

не должно 0x00000100 = 4.

Я понимаю, что 0x00000001 = 1 с 2^0 и 0x00000010 = 2 с 2^1. Что не так с моим мышлением?

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

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

мое утверждение терпит неудачу, потому что оно говорит, что 256 != 4

6 ответов


номера, которые начинаются с 0x интерпретируются как шестнадцатеричные (база 16) В C.

так 0x10 == 16 и 0x100 == 256, 0x10000 == 65536, etc.

полномочия два:

  • 20 = 0х1
  • 21 = 0x2
  • 22 = признаки 0x4
  • 23 = 0x8
  • 24 = 0x10
  • 25 = 0х20
  • 26 = на 0x40
  • 27 = 0х80

нет,0x означает шестнадцатеричный (т. е. базовый-16), а не двоичный, с которым вы, похоже, путаете его.

Если вы хотите использовать двоичные литералы в коде, то см. это так вопрос, в котором упоминается расширение gcc, которое позволяет 0b00000100 для представления 4 в двоичном.


на 0x префикс означает шестнадцатеричное


0x00000100 есть в базе-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


0x00000100 (hex) = 0000 0000 0000 0000 0000 0001 0000 0000 (binary) = 256 (decimal)


0x префикс шестнадцатеричных 0x00000100 = 256 base 16

00000100 = 00000120100

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

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

= 256 + 0 + 0

=256