Интегральные типов ранга меньше, чем int
преобразуются в любом int
или unsigned
при использовании в арифметической операции (см C11 6.3.1.8 обычных арифметических преобразований). Вот почему вы видите отливку до (int)
для x
и y
. Обратите внимание, что по умолчанию -rte
не будет выдавать предупреждение для downcasts, так как они не являются неопределенным поведением (6.3.1.3§3 указывает, что подписанные downcasts определены реализацией и что реализация может поднять сигнал). Если добавить опцию -warn-signed-downcast
, вы увидите утверждения вы, вероятно, искали, которые из-за актерскую в (char)
результате:
/*@ assert rte: signed_downcast: (int)x+(int)y ≤ 127; */
/*@ assert rte: signed_downcast: -128 ≤ (int)x+(int)y; */
Обратите внимание, что если вы сохраните результат в междунар, как в
void main(void) {
char x;
char y;
int z;
x = 1;
y = 127;
z = x + y;
return;
}
Не будет предупреждающего предупреждения (но будут присутствовать предупреждающие предупреждения о переполнении).