Переполнение в типе char

Рейтинг: 1Ответов: 1Опубликовано: 19.12.2014

Программа, описанная ниже, выводит -51 и 110.

У типа char диапазон -128 от 127. В памяти занимает 8 бит. Посчитал все, как полагается, в двоичной системе, посчитал переполнение с числом 205, получается вручную -49, никак не -51.

Объясните, пожалуйста, как получается -51, скорее даже как это происходит, скажем, "внутри компьютера"?

int main (void)
{
    char x=5,n=10;
    for(x+=100;x>0;x+=100);
    n+=100;
    printf("%i,%i",x,n);
    system("pause");
    return 0;

}

Ответы

▲ 3

Для выполнения сложения char преобразуется в int или (очень редко) unsigned int ("integer promotion").

Пример в вопросе не о переполнении char, а о сужающем преобразовании из int типа в char.

char в зависимости от реализации может быть типом со знаком или без знака (implementation-defined).

Преобразование для типов без знака таких как unsigned char определено в стандарте как арифметика по остатку максимального значения плюс один, например, если UCHAR_MAX равен 255, то

(unsigned char)205 + 100 == (int)305 == 305 - (UCHAR_MAX + 1) == 305 - 256 == 
(unsigned char)49

Если char тип имеет знак, то результат зависит от реализации (implementation-defined), например, в реализации, использующей ту же арифметику "по остатку":

(signed char)105 + 100 == (int)205 == 205 - 256 == (signed char)-51

Если сумма (char+int) не представима в типе int (integer overflow), то поведение не определено (bounded undefined behavior).