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

StackOverflow https://stackoverflow.com/questions/2760502

Вопрос

Я читал во многих местах, что Unsighted Integer Opllow хорошо определен в C, в отличие от подписанного аналога.

Недостаточный поток такой же?

Например:

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

Спасибо.

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

Это было полезно?

Решение

§6.2.5, пункт 9:

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

Редактировать:

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

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

Так да, x == UINT_MAX.

Другие советы

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

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

unsigned int x = 0u - 1u; // is OK though
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top