Integer | = Char;операция игнорирования старшего байта в Integer - PullRequest
1 голос
/ 02 сентября 2011

Просто быстрый и конкретный вопрос, это поставило меня в тупик почти на полчаса.

char * bytes = {0x01, 0xD8};
int value = 0;

value = bytes[0];  // result is 1 (0x0001)
value <<= 8;       // result is 256 (0x0100)
value |= bytes[1]; // result is -40? (0xFFD8) How is this even happening?

Последняя операция, которая меня интересует, как она превращает целое число со знаком 256 в-40?

edit : изменена большая часть примера кода для краткости

Ответы [ 3 ]

2 голосов
/ 02 сентября 2011

В вашем случае тип char эквивалентен signed char, что означает, что при сохранении значения 0xD8 в char оно будет отображаться как отрицательное число.

Обычные арифметические преобразования , которые происходят во время операции |=, сохраняют значение, поэтому отрицательное число сохраняется.

Чтобы решить эту проблему, вы можете указать все типы данных unsigned, если у вас есть двоичная арифметика. Или вы можете написать value |= ((unsigned char) buffer[0]) или value |= buffer[0] & 0xFF.

1 голос
/ 02 сентября 2011

Я думаю, у меня проблема, здесь char - это знак со знаком (216), но знак со знаком может хранить значение между (-128,127), что означает 216 (11011000). Наиболее значимый бит равен 1, то есть это отрицательныйчисло, которое комплимент 2 составляет 00101000, что эквивалентно -40

, когда вы делаете это значение | = bytes [1];

в этом случае фактически вы принимаете ИЛИ 256, -40

(256 | -40) равно -40

1 голос
/ 02 сентября 2011

Чтобы выполнить операцию |=, нам нужно, чтобы операнды с обеих сторон были одинакового размера.Поскольку char меньше int, его необходимо преобразовать в int.Но, поскольку char является типом со знаком, он расширяется до int расширением знака.

То есть D8 становится FFD8 еще до того, как произойдет операция или.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...