например
uint8_t value = 256;
отладочный вывод:
0
Я читал, что это делает своего рода усечение? Я не вижу, как именно, любые ссылки приветствуются.
Я постараюсь разобраться в этом вместе с вами.
uint8_t
является 8-битным типом данных или байтом. Он имеет 8 слотов, которые могут быть 1
или же 0
, 1111 1111
было бы 255. Так что, если вы объявите один к нему, он продолжает переноситься. 255 + 1 в двоичном виде будет 1 0000 0000
, но так как тип данных может хранить только 8 бит, он сбрасывает 1 и становится 0000 0000
, что переводится в целочисленное значение 0
,
По крайней мере, так я понимаю, это работает.
В соответствии с [conv.integral]
Если тип назначения не имеет знака, полученное значение будет наименее целым числом без знака, соответствующим исходному
целое число (по модулю 2 ^n
гдеn
количество битов, используемых для представления типа без знака). [ Замечания: В двух
дополняющее представление, это преобразование является концептуальным и нет изменений в битовой структуре (если есть
нет усечения). — конечная нота ]Если тип назначения подписан, значение не изменяется, если оно может быть представлено в типе назначения (и
ширина битового поля); в противном случае значение определяется реализацией.
Так что, для вашего примера, вы бы надежно получили ноль; если вы использовали int8_t
вместо uint8_t
результат будет зависеть от реализации. (Напротив, если операция со знаком целых чисел переполнение, результат — неопределенное поведение. Почему несоответствие? Я не знаю.)
В случае целочисленных типов без знака наименьшее соответствующее число битов сохраняется в переменной. (Ответ Брайана охватывает все, что я здесь говорю.)
Например, unsigned char a = 257
приведет к a=1
,
Компилятор (gcc
в этом случае) должен предупредить вас, когда вы делаете такие задания, например, filename.c:line:column: warning: overflow in implicit constant conversion [-Woverflow]
,