-6
#include <iostream>

using namespace std;

int main()
{
    for(int i=63;i>=0;--i)
    {
        cout<<(((1<<63)+1)&(/*(long long)*/1<<i)?"1":"0");
    }

    return 0;
}

結果は次のとおりです。

さて、結果がどうなるか誰が教えてくれますか?

XDR のバグに関する "CA-2002-25" を読んでいるので、この質問をします。そして、C Plus Plus のオーバーフローについてもっと知りたいと思います。

4

2 に答える 2

3

実際に何を期待していたのかを伝えるのはかなり難しいですが、コンパイラを介して実行すると、多くの有用な警告が生成されます。次のように、長い長い整数のリテラル シジルをあちこちに追加すると、次のようになります。

#include <iostream>

using namespace std;

int main()
{
    long long num = 0x7fffffff00000000ULL >> 32;
    for(int i=63;i>=0;--i)
    {
        cout<<(((1ULL<<63)+1ULL)&(1ULL<<i)?"1":"0");
    }

    return 0;
}

あなたは答えを得る

1000000000000000000000000000000000000000000000000000000000000001

これは私があなたのループに期待することです。num値を使用しなかったため、何を期待していたのかわかりませんが、ねえ! それも飾りました。

それはあなたの質問に答えていますか?

于 2012-07-31T15:07:45.287 に答える
0

これを試して:

#include <iostream>

int main()
{
    long long num=0x7fffffff00000000ll >> 32; 
                                //  ^^    
                                // Literals are by default int
                                // need to add ll to let the compiler
                                // know it is long long
    for(int i=63; i>=0 ;--i)
    {   
        long long mask = (1ll << i); 
                       //  ^^    Note here I want this to be a long long
                       //        before I start shifting it.
        std::cout << ((num & mask)?1:0);
    }   
    std::cout << "\n";

    return 0;
}

./a.out
0000000000000000000000000000000001111111111111111111111111111111

あなたのコードを見る:

cout<<(((1<<63)+1)&(/*(long long)*/1<<i)?"1":"0");

そこには定数があります:

int val = (1<<63)+1;
// since these are all integer literals (and I am guessing your platform is 32 bit)
0x00000001  or 000000000000000000000000000000001

したがって、その式の 2 番目の部分でループすると、次のようになります。

/*(long long)*/1<<i

i > 32 の後、結果は未定義ですが、ビットをラップして再び開始しているように見えます。だからあなたは設定しています

10000000000000000000000000000000100000000000000000000000000000001
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^    Mask bit wrapped around
                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The mask on 0x00000001
于 2012-07-31T15:10:34.900 に答える