Невозможно присвоить значение INT_MIN длинному длинному - PullRequest
5 голосов
/ 04 апреля 2011
signed long long value = -2147483648;
    cout << ((signed long long)value);

выводит 2147483648 (без знака минус), почему?

Ответы [ 3 ]

8 голосов
/ 04 апреля 2011
signed long long value = -2147483648;

2147483648 нельзя представить в 32-разрядном целом числе со знаком, поэтому он конвертируется в беззнаковое, затем применяется унарный минус (который ничего не меняет), а затем назначается подписанномудолго долго.Используйте -2147483648LL

1 голос
/ 04 апреля 2011

Литеральное целое число в C ++ имеет тип int. Если он не вписывается в этот тип, он может интерпретироваться как целое число без знака. Однако не гарантируется, что он автоматически будет рассматриваться как больший целочисленный тип.

Стандарт, к счастью, поддерживает суффиксную нотацию для указания явного типа литерала.

В этом случае вы должны использовать -2147483648LL.

0 голосов
/ 04 апреля 2011

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

Если LONG_MAX больше 2147483648, тогда тип литерал длинный, и минус должен дать правильное значение. Иначе, если компилятор уже поддерживает long long (и так как вы объявляете переменную этого типа, нужно предположить, что это так), тип 2147483648 длинный, длинный и минус должен дать правильное значение. Если компилятор не поддерживает long long и long всего 32 бита, тогда ваш код имеет неопределенное поведение, поэтому все, что делает компилятор, является "правильным".

...