You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP 7.1负数二进制求和疑问:为何(~5)+(~7)结果为-14?

为什么PHP中(~5) + (~7)的结果是-14?

哈哈,这个问题我刚接触二进制补码的时候也踩过一模一样的坑!你的手动计算错误出在只使用了4位二进制来计算,并且没有遵循PHP中整数的补码存储规则,咱们一步步拆解清楚:

首先明确PHP的整数存储规则

PHP中的整数是有符号的二进制补码形式存储的,通常是32位(64位系统下是64位,但核心逻辑一致),范围是 -2^31 到 2^31-1。按位取反操作会翻转每一位二进制位,结果依然是补码形式的有符号整数。

一步步计算~5和~7

  1. 计算~5

    • 5的32位二进制表示:00000000 00000000 00000000 00000101
    • 按位取反后每一位翻转:11111111 11111111 11111111 11111010(这是补码)
    • 补码转十进制:先减1得到反码 11111111 11111111 11111111 11111001,再取反得到原码 00000000 00000000 00000000 00000110(即6),加上负号后结果是 -6。
  2. 计算~7

    • 7的32位二进制表示:00000000 00000000 00000000 00000111
    • 按位取反后:11111111 11111111 11111111 11111000(补码)
    • 转十进制:减1得反码 11111111 11111111 11111111 11110111,取反得原码 00000000 00000000 00000000 00001000(即8),加负号后结果是 -8。
  3. 相加结果
    -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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:34:28