Стандарт C определяет это для беззнаковых типов:
Вычисление без знака
операнды никогда не могут переполняться, потому что
результат, который не может быть представлен
результирующий целочисленный тип без знака
уменьшено по модулю число, которое является одним
больше, чем наибольшее значение,
может быть представлен в результате
типа.
В этом случае, если ваш unsigned char
равен 8 битам, это означает, что результат будет уменьшен по модулю 256, что означает, что если b
было 0x55
, a
действительно закончится как 0xAA
.
Но учтите, что если unsigned char
на шире , чем 8 бит (что совершенно законно), вы получите другой результат. Чтобы гарантировать, что в результате вы получите 0xAA
, вы можете использовать:
a = ~b & 0xff;
(Поразрядный и должен быть оптимизирован на платформах, где unsigned char
равен 8 битам).
Обратите внимание, что если вы используете тип со знаком, результат определяется реализацией.