Есть ли способ доказать интегральное продвижение в int? - PullRequest
1 голос
/ 29 июля 2011

В чистом ANSI C, есть ли способ показать, что, учитывая

char c1 = 1, c2 = 2;

, тип следующего:

c1 + c2

равен int?

Спасибо.

ПРИМЕЧАНИЕ. Я знаю, что в соответствии со стандартами это так, но в C ++ вы можете использовать оператор typeid, чтобы показать это.Я хотел бы показать, что c1 + c2 - это int в C.

Ответы [ 5 ]

2 голосов
/ 29 июля 2011

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

0 голосов
/ 03 апреля 2013

Разве это не было бы больше фактом, что интегральное продвижение происходит на rvalues?

То есть c1 и c2 являются lvalues. Только результат c1 + c2 является значением.

Таким образом, добавление должно выполняться на символе, что приводит к переполнению, что приводит к 1.

Но впоследствии это значение типа char, содержащее значение 1, будет повышено до int с сохранением его значения (в C ++). Так что cout увидит int и выдаст соответственно.

Если cout был дан символ, он должен вывести символ со значением ASCII 1, который не предназначен для печати. ​​

0 голосов
/ 29 июля 2011

Я знаю, что это c ++, но я хотел использовать cout, потому что он определяет тип в отличие от printf, который нуждается в спецификаторе формата (т.е. изменит ваш результат)

char c1=156, c2=101;
cout << c2 + c1 << endl;

вывод равен 1 там он переполняется, диапазон только от 0 до 255. ЗАКЛЮЧЕНИЕ: это не int, а char

0 голосов
/ 29 июля 2011

Как насчет проверки с помощью sizeof (). Сам не проверял. Просто идея.

0 голосов
/ 29 июля 2011

Если c1 = 255 и x2 равно 255, то при добавлении они добавят ti 510, что слишком велико для символа, но нормально для int.

int x = c1 + c2;

...