переполнение при умножении беззнаковых символов? - PullRequest
7 голосов
/ 07 июня 2011

Когда я умножаю два знака без знака в C, вот так:

unsigned char a = 200;
unsigned char b = 200;
unsigned char c = a * b;

Тогда я знаю, что у меня будет переполнение, и в результате я получу (40'000 по модулю 256). Когда я делаю это:

unsigned char a = 200;
unsigned char b = 200;
unsigned int c = (int)a * (int)b;

Я получу правильный результат 40'000. Однако я не знаю, что происходит с этим:

unsigned char a = 200;
unsigned char b = 200;
unsigned int c = a * b;

Могу ли я быть уверенным, что происходит правильная вещь? Зависит ли этот компилятор? Точно так же я не знаю, что происходит при выполнении вычитания:

unsigned char a = 1;
unsigned char b = 2;
int c = a - b;

Когда я делаю символ "c" без знака, я, вероятно, получу 255 в результате. Что происходит, когда я использую int как этот?

Ответы [ 2 ]

7 голосов
/ 07 июня 2011

Аргументы арифметических операторов получают «обычные арифметические продвижения».

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

1 голос
/ 07 июня 2011

Скопировано из этого ответа В выражении C, где присутствуют unsigned int и sign int, какой тип будет повышен до какого типа?

6.3.1.3 Целые числа со знаком и без знака

1 Когда значение с целочисленным типом преобразуется в другой целочисленный тип, отличный от _Bool, если значение может быть представлено новым типом, оно не изменяется.

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

3 В противном случае новый тип подписывается и значение не может быть представлено в нем; либо результат> определяется реализацией, либо определяется сигнал реализации.

...