Хочу рассказать о двух странностях, с которыми мне пришлось столкнуться, программируя вычислительные алгоритмы на языке C.
Итак, первое неожиданное поведение для некоторых программистов. Вот маленькая прога.
#include <stdio.h>
int main()
{
unsigned char a = 1, b;
b = ~a >> 1;
printf("%u\n", b);
return 0;
}
Разберем ее. Поразрядная операция
~ инвертирует состояние каждого бита байта
a, в который изначально записана единица. В результате должны получить
11111110b, то есть
254. Сдвигая этот байт вправо на один бит, должны получить
127. Однако код, который дает, например, компилятор
gcc, выводит в консоль число
255?!
Сначала я подумал о том, что дело в приоритете — вдруг у компилятора приоритет операций «косячит»? То есть будто бы сначала делается сдвиг, а потом — инверсия (а что, логично...). Так в чем же дело?