Использование следующего макроса:
#define MIN_SWORD (signed int) 0x8000
Например, следующее выражение:
signed long s32;
if (s32 < (signed long)MIN_SWORD)...
, как ожидается, выполнит следующую проверку:
if (s32 < -32768)
Один из некоторых компиляторов, кажется, работает нормально. Но на каком-то другом компиляторе выражение вычисляется как:
if (s32 < 32768)
Мой вопрос: как компилятор ANSI-C должен оценивать следующее выражение:
(signed long) (signed int) 0x8000
Кажется, что в некоторых компиляторах приведение к `(подписанному целому) не вызывает (ожидаемое) преобразование из положительной константы 0x8000 в минимальное отрицательное значение целого со знаком, если впоследствии выражение приведено к более широкому типу подписано долго.
Другими словами, оцененная константа не эквивалентна:
-32768L (но 32768L)
Может ли это поведение быть неопределенным ANSI-C?