You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请解释以下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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 10:15:34