PHP 7.1负数二进制求和疑问:为何(~5)+(~7)结果为-14?
为什么PHP中
(~5) + (~7)的结果是-14? 哈哈,这个问题我刚接触二进制补码的时候也踩过一模一样的坑!你的手动计算错误出在只使用了4位二进制来计算,并且没有遵循PHP中整数的补码存储规则,咱们一步步拆解清楚:
首先明确PHP的整数存储规则
PHP中的整数是有符号的二进制补码形式存储的,通常是32位(64位系统下是64位,但核心逻辑一致),范围是 -2^31 到 2^31-1。按位取反操作会翻转每一位二进制位,结果依然是补码形式的有符号整数。
一步步计算~5和~7
计算
~5- 5的32位二进制表示:
00000000 00000000 00000000 00000101 - 按位取反后每一位翻转:
11111111 11111111 11111111 11111010(这是补码) - 补码转十进制:先减1得到反码
11111111 11111111 11111111 11111001,再取反得到原码00000000 00000000 00000000 00000110(即6),加上负号后结果是 -6。
- 5的32位二进制表示:
计算
~7- 7的32位二进制表示:
00000000 00000000 00000000 00000111 - 按位取反后:
11111111 11111111 11111111 11111000(补码) - 转十进制:减1得反码
11111111 11111111 11111111 11110111,取反得原码00000000 00000000 00000000 00001000(即8),加负号后结果是 -8。
- 7的32位二进制表示:
相加结果
-6 + (-8) = -14,这就和PHP脚本的输出完全一致了!
你的手动计算错在哪里?
你用4位二进制计算时,犯了两个关键错误:
- 错误地将取反后的二进制当成无符号整数直接相加(
1011 + 1001 = 0100),但实际上这些是有符号数的补码,不能直接按无符号规则计算。 - 即使是4位有符号数,
~5(4位中5是0101,取反是1010,这是补码,对应十进制-6),~7(4位中7是0111,取反是1000,对应十进制-8),相加也是-6 + (-8) = -14,你之前的计算忽略了补码转原码的步骤。
快速计算按位取反的小技巧
其实不用算二进制也能快速得到结果:对于任意整数x,~x = -x - 1。比如:
~5 = -5 -1 = -6~7 = -7 -1 = -8
相加后自然就是-14啦!
内容的提问来源于stack exchange,提问作者Houssem ZITOUN
相关产品推荐
相关产品推荐

