Что делает компилятор при приведении целочисленных констант? - PullRequest
3 голосов
/ 08 февраля 2011

Использование следующего макроса:

#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?

1 Ответ

2 голосов
/ 08 февраля 2011

Если int является 16-разрядным на вашей платформе, тогда тип 0x8000 равен unsigned int (см. 6.4.4, п.5 стандарта).Преобразование в signed int определяется реализацией, если значение не может быть представлено (см. 6.3.1.3 с.3).Поэтому поведение вашего кода определяется реализацией.

Сказав, что на практике я бы предположил, что это всегда должно делать то, что вы "ожидаете".Что это за компилятор?

...