C语言中按位取反(~)运算符为何返回-(N+1)?
为什么C语言中
~N等于-(N+1)? 这本质是有符号整数的补码表示规则导致的,按位取反确实是翻转所有位,但结合补码的运算逻辑,最终的十进制结果就等价于-(N+1)。
先搞懂补码的核心规则
C语言中,有符号整数默认用补码存储:
- 正数的补码和原码完全一致,符号位为0;
- 负数的补码是「原码除符号位外取反,再加1」;
- 而按位取反
~是对**所有位(包括符号位)**进行0和1的翻转,没有例外。
用实例拆解(以8位有符号整数char为例)
比如N=5,8位补码是00000101:
- 按位取反后得到
11111010; - 这个二进制是补码形式,符号位为1,说明是负数;
- 要得到它的十进制真值,需对补码做逆运算:先减1得到
11111001,再翻转所有位得到00000110(即6),所以真值是-6,刚好等于-(5+1)。
再比如N=-3,8位补码是11111101:
- 按位取反后得到
00000010; - 符号位为0,是正数,直接转十进制就是2,而
-(-3+1)=2,完全匹配。
特殊情况:无符号整数
如果是无符号整数,按位取反的结果就不会是-(N+1)。比如unsigned char N=5,按位取反后是11111010,转十进制是250,和-(5+1)毫无关系——因为无符号整数没有符号位,所有位都是数值位,翻转后直接是对应的无符号数值。
总结
按位取反~的行为确实是单纯翻转所有位,你理解的「常理」没错;但因为C语言对有符号整数用补码存储,翻转后的二进制对应的十进制真值刚好等于-(N+1),这是补码规则带来的等价结果,不是运算符本身的逻辑改变了。
内容的提问来源于stack exchange,提问作者nerdpanda
相关产品推荐
相关产品推荐

