Что происходит со значением, назначенным для размещения больше, чем доступное пространство типов?

например

uint8_t value = 256;

отладочный вывод:

0

Я читал, что это делает своего рода усечение? Я не вижу, как именно, любые ссылки приветствуются.

2

Решение

Я постараюсь разобраться в этом вместе с вами.

uint8_t является 8-битным типом данных или байтом. Он имеет 8 слотов, которые могут быть 1 или же 0, 1111 1111 было бы 255. Так что, если вы объявите один к нему, он продолжает переноситься. 255 + 1 в двоичном виде будет 1 0000 0000, но так как тип данных может хранить только 8 бит, он сбрасывает 1 и становится 0000 0000, что переводится в целочисленное значение 0,

По крайней мере, так я понимаю, это работает.

3

Другие решения

В соответствии с [conv.integral]

Если тип назначения не имеет знака, полученное значение будет наименее целым числом без знака, соответствующим исходному
целое число (по модулю 2 ^n где n количество битов, используемых для представления типа без знака). [ Замечания: В двух
дополняющее представление, это преобразование является концептуальным и нет изменений в битовой структуре (если есть
нет усечения). — конечная нота ]

Если тип назначения подписан, значение не изменяется, если оно может быть представлено в типе назначения (и
ширина битового поля); в противном случае значение определяется реализацией.

Так что, для вашего примера, вы бы надежно получили ноль; если вы использовали int8_t вместо uint8_tрезультат будет зависеть от реализации. (Напротив, если операция со знаком целых чисел переполнение, результат — неопределенное поведение. Почему несоответствие? Я не знаю.)

3

В случае целочисленных типов без знака наименьшее соответствующее число битов сохраняется в переменной. (Ответ Брайана охватывает все, что я здесь говорю.)

Например, unsigned char a = 257 приведет к a=1,

Компилятор (gcc в этом случае) должен предупредить вас, когда вы делаете такие задания, например, filename.c:line:column: warning: overflow in implicit constant conversion [-Woverflow],

1
По вопросам рекламы [email protected]