如何在MariaDB(InnoDB引擎)中使用按位或运算符(|)?
关于MariaDB负数按位或运算结果异常的解答
问题本质
MariaDB(包括MySQL)的按位运算并非使用1's补码,而是基于2's补码存储整数,但执行按位操作时会将所有操作数转换为无符号64位整数处理,运算结果也会以无符号形式返回。
你遇到的SELECT -1107296257 | -8388608得到18446744073709551615,是因为:
- 这两个负数在64位2's补码中都是高位全1的二进制数,按位或后结果是所有位全1;
- 全1的64位无符号整数对应的十进制值就是
18446744073709551615(等价于有符号的-1)。
解决方法
如果需要得到有符号整数的运算结果,只需将按位运算的结果显式转换为有符号类型即可,使用CAST()函数:
SELECT CAST(-1107296257 | -8388608 AS SIGNED);
执行上述语句会返回-1,这是符合2's补码逻辑的正确有符号结果。
补充说明
MariaDB没有全局设置让按位运算默认返回有符号结果的选项,所有按位操作默认都是以无符号64位整数为基准处理,只能通过显式类型转换来获取有符号结果。
内容的提问来源于stack exchange,提问作者mimic
相关产品推荐
相关产品推荐

