Уменьшение значения unsigned int ниже 0 undefined?

Это неопределенное поведение?

unsigned int size = 0;
size -= 1;

person Iharob Al Asimi    schedule 11.01.2015    source источник
comment
Нет. Стандарт C гарантирует обход по модулю степени двойки. 6.2.5 В разделе 9 Типы говорится: Вычисление с использованием беззнаковых операндов никогда не может переполниться, потому что результат, который не может быть представлен результирующим целочисленным типом без знака, уменьшается по модулю числа, которое на единицу больше, чем наибольшее значение, которое может быть представлено результирующим типом.   -  person Iwillnotexist Idonotexist    schedule 11.01.2015
comment
Это интересный вопрос в контексте недавнего вопроса о том, вызывает ли int i = INT_MAX + 1; UB. Но после @ 5gon12eder мне нравится stackoverflow.com/questions/18195715/   -  person Weather Vane    schedule 11.01.2015
comment
@WeatherVane: я думаю, что реализация могла бы законно определять свои числовые типы, так что приращение беззнакового значения типа, который ранжируется ниже int, могло бы привести к неопределенному поведению, но я не думаю, что это верно в отношении уменьшения. Если значение без знака, меньшее int, будет повышено до int, это int сможет без труда представлять как 0, так и -1; приведение подписанного значения -1 к беззнаковому типу любого размера требуется для получения значения, которое при преобразовании в соответствующий большой тип, увеличении и обратном приведении даст ноль.   -  person supercat    schedule 24.06.2015


Ответы (1)


Целые числа без знака имеют четко определенное поведение для всех арифметических операций; в частности, они реализуют «художественную обработку по модулю 2 N», где N - количество битов значения в типе. Итак, -1 на самом деле 2 N 1.

person Kerrek SB    schedule 11.01.2015
comment
означает ли это, что unsigned int x; for (x = SOME_POSITIVE_VALUE ; x >= 0 ; --x); - бесконечный цикл? - person Iharob Al Asimi; 11.01.2015
comment
(Более интересными, чем сложение, являются операции сдвига и остатка, которые также гораздо проще рассмотреть с беззнаковыми целыми числами, чем с целыми числами со знаком.) - person Kerrek SB; 11.01.2015
comment
@iharob Да. По определению unsigned целые числа равны >= 0. - person Iwillnotexist Idonotexist; 11.01.2015
comment
@iharob: Для целого числа без знака x, x >= 0 всегда верно, да. - person Kerrek SB; 11.01.2015
comment
Я просто следил за тем, чтобы это не было undefined behavior, у меня нет копии стандарта c, и, поскольку я живу в Венесуэле, не могу себе этого позволить, особенно в настоящее время. - person Iharob Al Asimi; 11.01.2015
comment
Все арифметические операции, кроме деления и по модулю на ноль и сдвигов битов больше ширины типа данных и, возможно, чего-то еще. Беззнаковое деление на int - это не то же самое, что деление по модулю N. (Хорошо, я закончил привередничать.) - person tmyklebu; 11.01.2015
comment
@iharob Вряд ли у кого-нибудь есть стандарт, все действительно цитируют черновик. Вот последний доступный проект стандарта, n1570 , который является окончательным вариантом перед выпуском стандарта C11. - person Iwillnotexist Idonotexist; 11.01.2015
comment
@IwillnotexistIdonotexist спасибо за ссылку, уже скачал. - person Iharob Al Asimi; 11.01.2015
comment
@mafso: Да, конечно. Спасибо! - person Kerrek SB; 11.01.2015