请解释以下C语言代码的输出结果及运行原理
这段C语言代码的运行原理分析
先看原代码:
#include <stdio.h> int main() { int x = 1; printf("%d, %d", ~x-x>>1, ~x-x<<1); return 0; }
输出结果为 -2, -6,下面一步步拆解运行逻辑:
1. 明确运算符优先级
C语言中运算符优先级从高到低为:按位取反~ > 减法- > 移位运算符>>、<<,移位运算符为左结合。因此原表达式等价于:
printf("%d, %d", ((~x) - x) >> 1, ((~x) - x) << 1);
2. 基于补码的位运算计算(以32位有符号int为例)
现代系统中,有符号整数以补码形式存储,我们基于32位int展开计算:
- 变量
x=1的补码:00000000 00000000 00000000 00000001 - 按位取反~x:对每一位取反,得到
11111111 11111111 11111111 11111110,该补码对应的十进制值是**-2**(补码转原码:取反加1得到00000000 00000000 00000000 00000010,符号位为1,故为-2)
3. 计算~x - x
代入~x=-2、x=1,可得:-2 - 1 = -3
-3的补码:11111111 11111111 11111111 11111101
4. 计算第一个表达式:((~x)-x) >> 1
有符号整数的右移是算术右移,高位补符号位(此处符号位为1):
-3的补码右移1位后:11111111 11111111 11111111 11111110,对应十进制值**-2**
5. 计算第二个表达式:((~x)-x) << 1
有符号整数的左移为逻辑左移(高位丢弃,低位补0),未溢出时左移1位等价于乘以2:
-3的补码左移1位后:11111111 11111111 11111111 11111010,对应十进制值**-6**
综上,最终输出为 -2, -6。
内容的提问来源于stack exchange,提问作者Abhinav Kumar
相关产品推荐
相关产品推荐

