Я отлаживал программу на C ++ и обнаружил, что по какой-то причине в моей версии visual studio 2008 некоторые числа не сохраняются правильно. Например, число -3254535440, похоже, хранится как 1040431856. Эти числа достаточно малы, чтобы их можно было хранить в long long, поэтому проблем быть не должно. Если я запускаю следующий код, отображаются оба сообщения об ошибках. Я пробовал на двух разных машинах. Любая идея? Спасибо!
if (-3254535440 == 1040431856)
printf("ERROR\n");
long long j = -3254535440;
if (j == 1040431856)
printf("ERROR2\n");
Протестировано под Microsoft Visual Studio 2008 версии 9.0.30729.1 SP
Литералы все еще int
s. Вы должны сделать их более крупным шрифтом:
long long j = -3254535440LL;
Это не вписывается в 32-битный тип (который, кажется, ваш int
есть), но когда-то представлен как long long
, он сохраняет свою ценность.
Скомпилируйте с более высоким уровнем предупреждения, и вы получите предупреждение:
#include <stdio.h>
int main()
{
long long j = -3254535440;
printf("%lld\n",j);
}
Составитель:
c:\>cl /nologo /W4 test.cpp
test.cpp
test.cpp(5) : warning C4146: unary minus operator applied to unsigned type, result still unsigned
c:\>test
1040431856
Как уже упоминалось, объявите вместо этого длинный длинный литерал:
#include <stdio.h>
int main()
{
long long j = -3254535440LL;
printf("%lld\n",j);
}
Результат:
c:\>cl /nologo /W4 test.cpp
test.cpp
c:\>test
-3254535440