1

__int64 variable がありますx = 0x8000000000000000

私はそれをバイト単位で右にシフトしようとします:x >> 4

結果は になるはずだと思っていました0x0800000000000000が、残念ながら になり0xf800000000000000ました。

VS10を使用しています。なぜそうなのですか?どうすればそれを解決できますか?

4

5 に答える 5

4

使用してみてください__uint64 variable x = 0x8000000000000000

私はあなたがそれをこのように宣言することもできると思います:

u64 x = 0x8000000000000000;

x >> 4あなたはあなたに与えるでしょう:

0x0800000000000000

MSBのどこからF来たのかについての詳細を参照してください。

于 2013-01-30T22:17:47.083 に答える
2

その理由は、左オペランドが少なくとも 0 の場合、符号付き数値のシフトは言語によってのみ定義されるためです。現在手元にリファレンスがありません)。通常、論理シフトまたは算術シフトのいずれかを取得します。

変数を符号なしにすることで問題を解決できれば、問題は解決します。

于 2013-01-30T23:52:24.617 に答える
2

まあ、それは簡単なことです。:)

あなたの番号は署名されています。最初のビットが設定されていると、それは負です。したがって、それを負に保つために、1 で埋められます。

署名なしにキャストしてからシフトすると、問題が解決するはずです。

于 2013-01-30T22:18:28.177 に答える
1

これは、あなたが負の数を持っているためです。シフトの前にunsignedを使用(または変換)します。

于 2013-01-30T22:17:44.663 に答える
1

符号付きの値は符号ビットだけ右にシフトされ、符号なしで 0 だけシフトされます。

int _tmain(int argc, _TCHAR* argv[])
{
    __int64  signedval;
    unsigned __int64  unsignedval;

    signedval=0x8000000000000000 >> 4;
    unsignedval=0x8000000000000000 >> 4;

        printf(" Signed %x  , unsigned %x   \n", signedval, unsignedval);

        getchar();

    return 0;
}

出力は次のとおりです。

Signed 0  , unsigned 8000000 
于 2013-01-30T22:44:33.540 に答える