__int64 variable がありますx = 0x8000000000000000
。
私はそれをバイト単位で右にシフトしようとします:x >> 4
結果は になるはずだと思っていました0x0800000000000000
が、残念ながら になり0xf800000000000000
ました。
VS10を使用しています。なぜそうなのですか?どうすればそれを解決できますか?
__int64 variable がありますx = 0x8000000000000000
。
私はそれをバイト単位で右にシフトしようとします:x >> 4
結果は になるはずだと思っていました0x0800000000000000
が、残念ながら になり0xf800000000000000
ました。
VS10を使用しています。なぜそうなのですか?どうすればそれを解決できますか?
使用してみてください__uint64 variable x = 0x8000000000000000
私はあなたがそれをこのように宣言することもできると思います:
u64 x = 0x8000000000000000;
x >> 4
あなたはあなたに与えるでしょう:
0x0800000000000000
MSBのどこからF
来たのかについての詳細を参照してください。
その理由は、左オペランドが少なくとも 0 の場合、符号付き数値のシフトは言語によってのみ定義されるためです。現在手元にリファレンスがありません)。通常、論理シフトまたは算術シフトのいずれかを取得します。
変数を符号なしにすることで問題を解決できれば、問題は解決します。
まあ、それは簡単なことです。:)
あなたの番号は署名されています。最初のビットが設定されていると、それは負です。したがって、それを負に保つために、1 で埋められます。
署名なしにキャストしてからシフトすると、問題が解決するはずです。
これは、あなたが負の数を持っているためです。シフトの前にunsignedを使用(または変換)します。
符号付きの値は符号ビットだけ右にシフトされ、符号なしで 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