Подписано в неподписанные преобразования - PullRequest
1 голос
/ 11 августа 2011

Может кто-нибудь объяснить, почему следующий код выводит то, что он делает:

char c = -1;
cout << (c << 8) << endl;
cout << ((unsigned char) c << 8) << endl;
cout << (c << 24) << endl;
cout << ((unsigned char) c << 24) << endl;

Вывод:

-256
65280
-16777216
-16777216

Я думал, что приведение к беззнаковому символу просто изменит способ получения битовинтерпретированы.Тем не менее, он изменил результаты при смещении влево на 8. Что странно, это не похоже на случай смещения влево на 24.

1 Ответ

3 голосов
/ 11 августа 2011

В каждом случае персонажа повышают до int до смены.

На вашей платформе char подписано, поэтому c равно -1, но (unsigned char)(c) равно 255.

Итак, вы видите:

  • -1 << 8
  • 255 << 8
  • -1 << 24
  • 255 << 24

Обратите внимание, что последний переполняется и переносится (на вашей платформе).Он отличается от 255U << 24, то есть 4278190080. Чтобы достичь этого, вы должны сказать (unsigned int)(unsigned char) c << 24.

...