我一直认为在执行 (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
好像我完全错过了一些东西。有任何想法吗?
原文由 Elad Weiss 发布,翻译遵循 CC BY-SA 4.0 许可协议
这是不一样的。试试
num = -79
,你会从这两个操作中得到不同的结果。(-79) % 256 = -79
,而(-79) & 0xff
是一些正数。使用
unsigned int
,操作相同,代码可能相同。PS- 有人评论
这不是它在 C、C++、Objective-C 中的定义方式(即问题中的代码将编译的所有语言)。