3

掛けて0x1d400 * 0xE070381Dいます。

電卓でこれを行うと、結果は0x00019A4D26950400

これをcppで実装しようとしたとき、これが私が持っているものです。

long long d;

d = 3765450781 * 1d400;

このコードの結果はd = 0x26950400. これは下位 4 バイトだけです。他はどうなりましたか?

上位 4 バイトを分離0x00019A4Dして別の変数に保存しようとしています。これはどのように行うことができますか?

乗算で 8 バイトすべてを表示できた場合、上位 4 バイトを分離するために考えていたことは次のとおりです。

d = d & 0xFF00; //0xFF00 == (binary) 1111111100000000

d = d>>8;

これは機能しますか?

4

3 に答える 3

6

数字の後に追加しますLL(例:3765450781LLintd

于 2011-05-08T00:59:46.927 に答える
5

MByDによる別の回答に示されているようLLに、定数の後にを使用する必要があります。long long

さらに、データ型はである必要がありますunsigned long long。そうでなければ、右シフトすると、符号拡張のために左端のビットが繰り返される可能性があります。(これはマシンに依存しますが、ほとんどのマシンの符号は、右シフト時に負の数を拡張します。)

右シフトを行うと、下の4バイトが破棄されるため、右シフトの前に上位4バイトをマスクする必要はありません。

最後に、toの引数はシフトするビット>>数であり、バイト数ではないことに注意してください。したがって、あなたはしたい

d = d >> 32;

これは次のように書くこともできます

d >>= 32;
于 2011-05-08T01:11:58.430 に答える
1

他の人が指摘しているように、64ビットの数値リテラルには。の接尾辞を付ける必要がありますLL

long long変数を16進数で出力するには、フォーマット指定子を使用します"%016llX"

long long d;
d = 3765450781LL * 0x1d400LL;
printf("%016llX\n", d);

出力00019A4D26950400

変数の上位32ビットと下位32ビット(4バイト)を取得するには、次のdようにします。

unsigned int upper;
unsigned int lower;

upper = d >> 32;
lower = d & 0x00000000FFFFFFFF;

printf("upper: %08X lower: %08X\n", upper, lower);
于 2011-05-08T01:25:16.303 に答える