Вопрос о поведении C для потери значимости беззнаковых целых чисел

Я читал во многих местах, что переполнение беззнаковых целых чисел четко определено в C в отличие от дубликата со знаком.

Действительно ли потеря значимости является тем же?

Например:

unsigned int x = -1; // Does x == UINT_MAX?

Спасибо.

Я не могу вспомнить, где, но я читал где-нибудь, что арифметика на неподписанных целочисленных типах является модульной, поэтому если это имело место затем-1 == модификация UINT_MAX (UINT_MAX+1).

18
задан 2 revs, 2 users 96% 7 August 2019 в 18:07
поделиться

3 ответа

§6.2.5, абзац 9:

Вычисление с использованием беззнаковых операндов никогда не может быть переполнено, потому что результат , который не может быть представлен , результирующий беззнаковый целочисленный тип равен {{1} } уменьшено по модулю числа, которое на один больше, чем наибольшее значение, которое может быть представлено результирующим типом .

Edit:

Извините, неверная ссылка, но результат все еще закреплен. Правильная ссылка - §6.3.1.3 (преобразование целых чисел со знаком и без знака):

если новый тип - без знака, значение преобразуется путем многократного добавления или вычитания единицы {{1} } больше, чем максимальное значение, которое может быть представлено в новом типе, пока значение не окажется в диапазоне нового типа .

Итак, да, x == UINT_MAX .

23
ответ дан 30 November 2019 в 08:37
поделиться

Вы смешиваете числа со знаком и без знака, что нехорошо.

unsigned int x = 0u - 1u; // is OK though
-3
ответ дан 30 November 2019 в 08:37
поделиться

-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;
}
4
ответ дан 30 November 2019 в 08:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: