Назначение максимального значения меньшего целого числа до более целого числа

StackOverflow https://stackoverflow.com/questions/4073616

  •  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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top