Рассмотрим следующий код:
uint32_t x = ~uint8_t(0);
std::cout << x << std::endl;
Теперь я полностью ожидал, что это выдаст 255
, но вместо этого он выдаст 4294967295
.
Мне известно о целочисленном продвижении в C ++, но я не могу понять, почему это произошло. Насколько я понимаю, выражение ~uint8_t(0)
должно оцениваться до 1111 1111
в двоичном виде. Оператор ~
будет приводить к тому, что тип будет повышен до int
(для обсуждения я буду считать его 32-битным), при этом знак расширяет значение до 0000 0000 0000 0000 0000 0000 1111 1111
. Это повышенное значение должно быть присвоено lvalue x
, в результате чего x == 255
.
Но, очевидно, я не правильно понимаю это. Чего мне не хватает?