Вопрос о поведении C при потере целого числа без знака - PullRequest
17 голосов
/ 03 мая 2010

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

Является ли недостаточный уровень тем же?

Например:

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

Спасибо.

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

Ответы [ 3 ]

23 голосов
/ 03 мая 2010

§6.2.5, пункт 9:

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

Edit:

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

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

Так что да, x == UINT_MAX.

4 голосов
/ 03 мая 2010

-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;
}
0 голосов
/ 03 мая 2010

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

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