为什么编译器对整数Bitwise NOT按位非运算采用2's complement补码规则?
为什么对整数执行按位非(Bitwise NOT)运算时,编译器会采用补码(2's complement)规则计算?
核心原因非常简单:当前主流计算机体系的有符号整数,本身就是默认以补码格式存储和运算的,并非编译器额外对按位非的结果做了补码转换。
补码成为有符号数标准存储格式的核心优势有两个:
- 可以将有符号数的加法和减法统一为加法电路实现,不需要单独设计减法运算硬件,大幅降低了CPU算术逻辑单元的实现成本
- 符号位可以直接和数值位共同参与运算,不需要额外判断符号位单独处理,运算逻辑更简洁
示例说明
我们以4位有符号整数为例,对应你给出的~5 = -6的结果:
- 十进制数5的4位补码表示为
0101 - 按位非运算会对每一位二进制位做翻转,得到结果
1010 - 这时候如果把
1010解析为无符号整数,对应的十进制值确实是10;但如果作为系统默认的有符号整数解析,就会按照补码规则计算真值:
4位补码的最高位权重为-2^(4-1) = -8,剩余三位权重为正,所以1010的真值为1*(-8) + 0*4 + 1*2 + 0*1 = -6
如果显式把按位非的结果强制转换为无符号类型输出,就会得到无符号值10,不会被解析为负数。
内容的提问来源于stack exchange,提问作者Hanish gopi
相关产品推荐
相关产品推荐

