Почему я не могу напрямую установить переменную __int64 в -2500000000? - PullRequest
6 голосов
/ 18 февраля 2011

Эта программа написана на VC ++ 6.0 на компьютере с WindowsXP.

Если я попытаюсь установить переменную __int64 в -2500000000 напрямую, она будет усечена до 32-битного значения, и будет взято дополнение к двум.

__int64 testval;
testval = -2500000000;

В этот момент testval равен 1794967293 (110 1010 1111 1101 0000 0111 0000 0000 двоичный).

Когда я устанавливаю переменную 2500000000, а затем умножаю ее на отрицательную, она работает:

__int64 testval;
testval = 2500000000;
testval *= -1;

Переменная testval равна -2500000000 (1001 0101 0000 0010 1111 1001 0000 0000 двоичный).

Есть идеи? Спасибо.

Ответы [ 3 ]

10 голосов
/ 19 февраля 2011

Получите новый компилятор. Соответствие стандарту VC6 ОЧЕНЬ плохое.

В VC6 попробуйте суффикс i64, как в

__int64 toobig = -2500000000i64;

Найдено Документация !

9 голосов
/ 18 февраля 2011

Компилятор обрабатывает константу 2500000000 как 32-битное число. Вам нужно явно указать, чтобы он воспринимался как long int, добавляя LL в конец константы. Итак, попробуйте вместо:

testval = -2500000000LL;

Обновление : поскольку ваш компилятор не поддерживает это, и вы застряли с VC6, попробуйте вместо этого разбить его на значение, которое получается в результате произведения двух 32-битных чисел, как в:

testval = -250000;
testval *= 10000;
2 голосов
/ 19 февраля 2011

Правильный синтаксис -2500000000LL.Если это не сработает, получите новый компилятор.

...