Может кто-нибудь объяснить поведение моего правого смещения в C? - PullRequest
0 голосов
/ 10 февраля 2019

Я не понимаю результат следующего кода:

unsigned char p = 170;
p = (~p) >> 4 & 255;

Результат: 245, и я не понимаю, почему.

Сначала (~ p) будетприменяется то, что составляет от 10101010 до 01010101

Это положительное число, поэтому >> 4 приведет к 00000101 в моем понимании.

Но, похоже, это 11110101, и я не понимаю, почему.В моем понимании сдвиг положительного числа вправо вставит 0, а не 1.

1 Ответ

0 голосов
/ 10 февраля 2019

При использовании в выражении целое число, меньшее int, обычно преобразуется в int.Так, используя 16-битный int для иллюстрации, в (~p) >> 4 & 255:

  • p равен 10101010 2 .
  • Это преобразуется вint, производит 0000000010101010 2 .
  • ~p производит 1111111101010101 2 .
  • (~p) >> 4 может производить 1111111111110101 2 .(Сдвиг вправо отрицательных значений определяется реализацией.)
  • (~p) >> 4 & 255 производит 11110101 2 .
  • 11110101 2 равно 245.
...