十进制下按位取反运算符~作用于12为何得到结果-13
按位取反运算符~的计算逻辑说明
错误原因
- 仅对数值的有效二进制位做了翻转,未考虑整数存储的所有高位(包括符号位)都会参与运算
- 忽略了编程语言中默认整数为有符号补码类型,负数的二进制值不能直接按无符号规则换算
正确运算步骤(以常用的32位有符号int为例)
- 十进制12的32位补码表示:正数的补码与原码一致,为
00000000 00000000 00000000 00001100 - 执行按位取反操作,所有二进制位0变1、1变0,得到结果的补码:
11111111 11111111 11111111 11110011 - 将补码转换为十进制值:
- 最高位为1,代表这是负数的补码
- 负数补码转原码规则:补码减1得到反码,反码除符号位外逐位翻转得到原码
- 上述补码减1得
11111111 11111111 11111111 11110010 - 除符号位逐位翻转后得到原码
10000000 00000000 00000000 00001101,对应十进制值为-13
快速计算规律
对于任意有符号整数n,按位取反的结果恒满足公式:~n = -(n + 1)
代入数值12可直接算出结果为-(12 + 1) = -13。
补充说明
如果使用无符号整数类型,按位取反的结果为所有位翻转后的无符号值,不会出现负数,例如8位无符号整数12取反的结果为243。
内容的提问来源于stack exchange,提问作者minos01
相关产品推荐
相关产品推荐

