Java按位取反(~)运算结果为负数的原理问题咨询
Java按位取反运算符(~)运算规则说明
核心前置规则
Java中int是32位有符号整数,所有整数以补码形式存储:
- 最高位为符号位,
0代表正数,1代表负数 - 正数的补码和原码完全一致
- 负数补码转十进制规则:先减1得到反码,再对除符号位外的所有位取反得到原码,最后转换为十进制值加负号
- 通用快速计算规律:
~n = -(n + 1)
示例1:~15 = -16 运算逻辑
- 15作为正整数,32位补码为:
00000000 00000000 00000000 00001111 - 按位取反后所有位0转1、1转0,得到补码:
11111111 11111111 11111111 11110000 - 补码转十进制:
- 补码减1得到反码:
11111111 11111111 11111111 11101111 - 除符号位外取反得到原码:
10000000 00000000 00000000 00010000 - 原码对应十进制值为-16
- 补码减1得到反码:
- 符合快速计算规律:
~15 = -(15+1) = -16
示例2:~6 = -7 运算逻辑
- 6作为正整数,32位补码为:
00000000 00000000 00000000 00000110 - 按位取反后得到补码:
11111111 11111111 11111111 11111001 - 补码转十进制:
- 补码减1得到反码:
11111111 11111111 11111111 11111000 - 除符号位外取反得到原码:
10000000 00000000 00000000 00000111 - 原码对应十进制值为-7
- 补码减1得到反码:
- 符合快速计算规律:
~6 = -(6+1) = -7
关于「按位取反结果都是负数」的说明
这个结论只在原操作数为正整数时成立:
- 正整数补码最高位为0,按位取反后最高位变为1,所以结果为负数
- 如果原操作数是负数,补码最高位为1,按位取反后最高位变为0,结果就是正数,比如
~(-16) = 15、~(-7) = 6,同样符合~n = -(n+1)的计算规律
内容的提问来源于stack exchange,提问作者user14917213
相关产品推荐
相关产品推荐

