为什么(a%256)不同于(a&0xFF)

0 投票
最新提问 2月 20 用户: 高手 (380 分)

我总是认为,优化代码(a % 256)时,自然会使用一个按位与操作,就像(a & 0xFF)。

当在编译器explorer gcc-6.2(-O3)上测试时:

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

而当尝试其他代码:

int mod(int num) {
    return num & 0xFF;
}

mod(int):
    movzx   eax, dil
    ret

似乎完全不一样,到底有什么不同呢?

1个回答

0 投票
最新回答 2月 20 用户: 花花 (390 分)
这的确是不一样的。尝试一下 num = -79,这两种操作会得到不同的结果。(-79) % 256 = -79,而是(-79) & 0xff的结果是正数。

使用unsigned int,操作是一样的,代码可能会是一样的。
欢迎来到编程助手,编程方面有什么不懂的问题可以尽管在这里提问,你将会收到热心爱好者的回答。
...