Назначение максимального значения меньшего целого числа до более целого числа
-
28-09-2019 - |
Вопрос
Рассмотрим следующий код:
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
.
Но, очевидно, я не понимаю это правильно. Что мне не хватает?
Решение
Интегральные акции выполняются на опереном одинакового ~
, Итак uint8_t(0)
способствует int
А потом ~
оценивается. Это эквивалентно
~(int)(uint8_t)0
Вы можете получить максимальное значение, представимое по типу, используя std::numeric_limits<T>::max()
; Если тип не подписан, вы также можете бросить -1
к этому типу:
uint32_t x = (uint8_t)-1;
Другие советы
В вашем примере побитовое не оператор (~
) продвигает свой операнд к int
до его выполнения. Затем это преобразуется в unsigned int
по заданию.
Вот некоторые смежные образцы кода, которые делают это более понятно:
uint8_t y = ~uint8_t(0);
uint32_t x = y;
std::cout << x << std::endl;
255
uint8_t y = uint8_t(0);
int z = ~y;
uint32_t x = z;
std::cout << x << std::endl;
4294967295