Я читал во многих местах, что переполнение беззнаковых целых чисел четко определено в C в отличие от дубликата со знаком.
Действительно ли потеря значимости является тем же?
Например:
unsigned int x = -1; // Does x == UINT_MAX?
Спасибо.
Я не могу вспомнить, где, но я читал где-нибудь, что арифметика на неподписанных целочисленных типах является модульной, поэтому если это имело место затем-1 == модификация UINT_MAX (UINT_MAX+1).
§6.2.5, абзац 9:
Вычисление с использованием беззнаковых операндов никогда не может быть переполнено, потому что результат , который не может быть представлен , результирующий беззнаковый целочисленный тип равен {{1} } уменьшено по модулю числа, которое на один больше, чем наибольшее значение, которое может быть представлено результирующим типом .
Edit:
Извините, неверная ссылка, но результат все еще закреплен. Правильная ссылка - §6.3.1.3 (преобразование целых чисел со знаком и без знака):
если новый тип - без знака, значение преобразуется путем многократного добавления или вычитания единицы {{1} } больше, чем максимальное значение, которое может быть представлено в новом типе, пока значение не окажется в диапазоне нового типа .
Итак, да, x == UINT_MAX
.
Вы смешиваете числа со знаком и без знака, что нехорошо.
unsigned int x = 0u - 1u; // is OK though
-1, когда выражается как число с дополнением до 2, составляет 0xFF ... F для того, сколько битов ваше число. В пространстве чисел без знака это значение является максимально возможным значением (т. Е. Все биты установлены). Следовательно, да, x == UINT_MAX. Следующий код выдает "1" в строгом компиляторе C99:
#include <stdio.h>
#include <stdint.h>
#include <limits.h>
int main(int argc, char **argv){
uint32_t x = -1;
printf("%d", x == UINT_MAX ? 1 : 0);
return 0;
}