Ваш оригинальный код может содержать неопределенное поведение, но выглядит
больше похоже на ошибку компилятора для меня. Как уже отмечалось,
константа 2147483648 не может быть представлена в 32-битном int.
Согласно стандарту «Тип целочисленного литерала
зависит от его формы, значения и суффикса. Если он десятичный и имеет
без суффикса, он имеет первый из этих типов, в котором его значение
может быть представлен: int, long int; если значение не может быть
представленный как длинный int, поведение не определено. "
черновик C ++ 0x добавляет long long в конце этого.
Если LONG_MAX больше 2147483648, тогда тип
литерал длинный, и минус должен дать правильное значение.
Иначе, если компилятор уже поддерживает long long (и так как
вы объявляете переменную этого типа, нужно предположить, что
это так), тип 2147483648 длинный, длинный и минус
должен дать правильное значение. Если компилятор не поддерживает
long long и long всего 32 бита, тогда ваш код имеет
неопределенное поведение, поэтому все, что делает компилятор, является "правильным".