1. ホーム
  2. c++

[解決済み] (a % 256)と(a & 0xFF)はなぜ違うのですか?

2022-05-03 10:55:20

質問

私はいつも (a % 256) と書くと、オプティマイザは当然効率的なビット演算を使用します。 (a & 0xFF) .

コンパイラエクスプローラ gcc-6.2 (-O3)でテストした場合。

// Type your code here, or load an example.
int mod(int num) {
    return num % 256;
}

mod(int):
    mov     edx, edi
    sar     edx, 31
    shr     edx, 24
    lea     eax, [rdi+rdx]
    movzx   eax, al
    sub     eax, edx
    ret

そして、他のコードを試すと

// Type your code here, or load an example.
int mod(int num) {
    return num & 0xFF;
}

mod(int):
    movzx   eax, dil
    ret

完全に何かを見逃しているようだ。 何か思い当たることはありませんか?

解決方法は?

同じではありません。試してみる num = -79 というように、両方の操作で異なる結果を得ることができます。 (-79) % 256 = -79 一方 (-79) & 0xff はある正の数である。

使用方法 unsigned int の場合、操作は同じであり、コードも同じになる可能性が高いです。

PS- ある方からコメントをいただきました

同じではないはずです。 a % b は次のように定義されています。 a - b * floor (a / b) .

C、C++、Objective-C(つまり、問題のコードがコンパイルされるすべての言語)では、そのように定義されていないのです。