如果你只是在前面加上一个否定运算符,任何体面的编译器都会实现这个位操作,即-a
. 无论如何,你是在 OR-ing 位。你应该 XOR 它。这就是我测试过的编译器所做的(GCC、MSVC、CLang)。所以,帮自己一个忙,写-a
编辑:请注意,C 不强制执行任何特定的浮点格式,因此对非整数 C 变量的任何位操作最终都会导致错误行为。
编辑 2 由于评论:这是 GCC 为 x86_64 发出的否定代码
.globl neg
.type neg, @function
neg:
.LFB4:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
movq %rsp, %rbp
.cfi_offset 6, -16
.cfi_def_cfa_register 6
movss %xmm0, -4(%rbp)
movss -4(%rbp), %xmm1
movss .LC0(%rip), %xmm0
xorps %xmm1, %xmm0 /* <----- Sign flip using XOR */
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE4:
.size neg, .-neg
需要注意的xorps
是,XOR 是为浮点数设计的,照顾特殊条件。这是一个 SSE 指令。