【LeetCode刷题】不使用+-的加减法:妙解
加法器,只使用异或和与操作即可完成。在这个题目里,因为服务器程序编译的时候使用了 AddressSanitizer 工具,会对有符号数的左移位操作做保护,强制转成无符号数做移位可绕过。
有几个关键的点,有符号和无符号数。
- 符号对加减的结果不产生任何影响。至于是解释成负数还是正数,取决于你怎么解读。比如 0xffffffff,你可以认为它是 int 类型的 -1,也可以认为它是 unsigned int 类型的 0xffffffff.
-
符号位会影响:类型转换时的符号拓展操作、移位操作、大小比较的结果。从汇编指令的角度看,这几种汇编指令都区分了有符号和无符号版本的指令。(大小比较借助cmp 指令,cmp 指令本身不区分符号位,但是它会影响标志寄存器。如果你要比较结果,有符号和无符号看的 flag 位是不一样的)
来自 <https://leetcode-cn.com/problems/sum-of-two-integers/comments/>