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

C语言中按位取反(~)运算符为何返回-(N+1)?

为什么C语言中~N等于-(N+1)?

这本质是有符号整数的补码表示规则导致的,按位取反确实是翻转所有位,但结合补码的运算逻辑,最终的十进制结果就等价于-(N+1)。

先搞懂补码的核心规则

C语言中,有符号整数默认用补码存储:

  • 正数的补码和原码完全一致,符号位为0;
  • 负数的补码是「原码除符号位外取反,再加1」;
  • 而按位取反~是对**所有位(包括符号位)**进行0和1的翻转,没有例外。

用实例拆解(以8位有符号整数char为例)

比如N=5,8位补码是00000101:

  1. 按位取反后得到11111010;
  2. 这个二进制是补码形式,符号位为1,说明是负数;
  3. 要得到它的十进制真值,需对补码做逆运算:先减1得到11111001,再翻转所有位得到00000110(即6),所以真值是-6,刚好等于-(5+1)。

再比如N=-3,8位补码是11111101:

  1. 按位取反后得到00000010;
  2. 符号位为0,是正数,直接转十进制就是2,而-(-3+1)=2,完全匹配。

特殊情况:无符号整数

如果是无符号整数,按位取反的结果就不会是-(N+1)。比如unsigned char N=5,按位取反后是11111010,转十进制是250,和-(5+1)毫无关系——因为无符号整数没有符号位,所有位都是数值位,翻转后直接是对应的无符号数值。

总结

按位取反~的行为确实是单纯翻转所有位,你理解的「常理」没错;但因为C语言对有符号整数用补码存储,翻转后的二进制对应的十进制真值刚好等于-(N+1),这是补码规则带来的等价结果,不是运算符本身的逻辑改变了。

内容的提问来源于stack exchange,提问作者nerdpanda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 23:43:16