Подтвердить что ты не робот

Вопрос о поведении C для неподписанного целого нижнего потока

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

Недостаточно ли то же самое?

Например:

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

Спасибо.

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

4b9b3361

Ответ 1

§6.2.5, пункт 9:

Вычисление, включающее unsigned операнды никогда не могут переливаться, поскольку результат, который не может быть представлен результирующий целочисленный тип без знака равен уменьшено по модулю число, которое является одним больше, чем наибольшее значение, которое могут быть представлены результатом тип.Забастовкa >

Edit:

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

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

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

Ответ 2

-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;
}

Ответ 3

Вы смешиваете подписанные и неподписанные числа, которые являются uncool.

unsigned int x = 0u - 1u; // is OK though