-2

我正在调试一个 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 下测试

4

2 回答 2

4

文字仍然int是 s。您需要使它们成为更大的类型:

long long j = -3254535440LL;

这不适合 32 位类型(它似乎是你int的),但是一旦表示为 a long long,它就会保持它的值。

于 2013-03-13T19:29:58.983 回答
2

用更高的警告级别编译,你会得到一个警告:

#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

正如其他人所提到的,改为声明一个 long long 文字:

#include <stdio.h>

int main()
{
    long long j = -3254535440LL;
    printf("%lld\n",j);
}

结果:

c:\>cl /nologo /W4 test.cpp
test.cpp

c:\>test
-3254535440
于 2013-03-13T19:49:18.160 回答