как перевести символ в шестнадцатеричный и двоичный - PullRequest
0 голосов
/ 18 июня 2011

У меня есть следующий пример на C:

int x = 123; 

size of int = 4 bytes.
hex value = 7b
binary value = 0111 1011

Каким будет шестнадцатеричное / двоичное значение, если мой x был символом?

char x = 123;
size of char = 1 byte.
hex value = ??
binary value = ??

Ответы [ 4 ]

2 голосов
/ 18 июня 2011

Поскольку char меньше, чем int, оно будет таким же. За исключением лидирующих нулей вы найдете в int.

Попробуйте это:

  6   int x = 123;
  7 
  8   printf ("Size of int is  %d bytes\n", sizeof(int));
  9   printf ("Size of char is %d byte\n", sizeof(char));
 10 
 11   printf ("Hex value is %x\n", x);
 12   printf ("Hex value is %x\n", (char)x);
 13 
 14   printf ("As for binary value .... google is your friend\n");

Вывод:

Size of int is  4 bytes
Size of char is 1 byte

Hex value is 7b
Hex value is 7b

Что касается двоичного значения .... Google - ваш друг Этот сайт , кажется, хорошо объясняет вещи

1 голос
/ 18 июня 2011

Его шестнадцатеричные и двоичные значения будут точно такими же (за исключением, возможно, начальных нулей, если вы хотите расширить его до полного размера).

Это потому, что 123 отлично вписывается в char.Знаковый символ может содержать по крайней мере значения от -127 до 127 (дополнение двух может обрабатывать -128, но стандарт ISO допускает дополнение и знак / величину как два других кодирования для отрицательных чисел, ни одно из которых не может обрабатывать-128), беззнаковый символ не менее 0 через 255.

Предполагая 8-битный байт и 4-байтовый int:

Value  HexInt  HexChar                 BinaryInt                 BinaryChar
-----  ------  -------  ---------------------------------------  ----------
123      7B      7B     0000 0000 0000 0000 0000 0000 0111 1011   0111 1011

Двоичное значение 0111 1011 рассчитывается следующим образом:

0111 1011
 ||| | ||
 ||| | |+-   1
 ||| | +--   2
 ||| |
 ||| +----   8
 ||+------  16
 |+-------  32
 +--------  64
           ===
           123

Если вы пытаетесь поместить значение в 8-битный char, который был больше 8 бит, то младшие значащие биты обычно сохраняются.

char xyz = 0x1234; // results in xyz being given the value 0x34.

Это подробно описано в C99, раздел 6.3.1.3/2 и /3:

1 / Когда значение с целочисленным типом преобразуется в другой целочисленный тип, отличный от _Bool, еслизначение может быть представлено новым типом, оно не изменяется.

2 / В противном случае, если новый тип является беззнаковым, значение преобразуется путем многократного сложения или вычитания более одного максимального значения, которое может быть представленов новомвведите, пока значение не окажется в диапазоне нового типа.

3 / В противном случае новый тип подписывается и значение не может быть представлено в нем;либо результат определяется реализацией, либо определяется сигнал реализации.

0 голосов
/ 18 июня 2011

Это было бы то же самое. Гекс 0x7b, 0111 1011

Обратите внимание, что если ваши целые числа равны 4 байта, его биты равны 0000 0000 0111 1011.

0 голосов
/ 18 июня 2011

Десятичный знак 123 равен 0x7b в шестнадцатеричном формате и 0111 1011 в двоичном, независимо от исходного типа. Единственный раз, когда тип мешает - это переполнение (например, int x = 48273; char y = (char)x;). Иногда отображение signed char и unsigned char может отличаться.

...