下面是C编译器如何实现这些操作符(gcc8.1和clang6.0用于x86-64 System V调用约定,在Godbolt编译器资源管理器上)。两个编译器生成相同的代码,正确地选择了最有效的现代Intel/AMD CPU实现。
int bitnot(int a) { return ~a; }
mov eax, edi
not eax
ret
int logical_not(int a) { return !a; }
xor eax, eax
test edi, edi
sete al
ret
int booleanize(int a) { return !!a; }
xor eax, eax
test edi, edi
setne al
ret
1条答案
按热度按时间gupuwyp21#
x86
NOT
是逐位运算;它只是单独反转每个位,如xor reg, -1
,但不影响FLAGS。NOT
实现了C's~
operator,与!
(logical not)完全不同。下面是C编译器如何实现这些操作符(gcc8.1和clang6.0用于x86-64 System V调用约定,在Godbolt编译器资源管理器上)。两个编译器生成相同的代码,正确地选择了最有效的现代Intel/AMD CPU实现。