-2

私はC++プログラムをデバッグしていましたが、何らかの理由で、私のバージョンのVisual Studio 2008では、一部の数値が正しく保存されていないように見えることがわかりました。たとえば、番号-3254535440は1040431856として格納されているようです。これらの数値は、long longに格納できるほど小さいため、問題はありません。次のコードを実行すると、両方のエラーメッセージが表示されます。私は2つの異なるマシンで試しました。何か案が?ありがとう!

if (-3254535440 == 1040431856)
    printf("ERROR\n");

long long j = -3254535440;
if (j == 1040431856)
    printf("ERROR2\n");

Microsoft VisualStudio2008バージョン9.0.30729.1SPでテスト済み

4

2 に答える 2

4

リテラルはまだintsです。それらをより大きなタイプにする必要があります:

long long j = -3254535440LL;

これは32ビットタイプ(あなたのように見えますint)には適合しませんが、一度は、として表されると、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 に答える