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

为何!(-my_int_min & INT_MIN)运算结果为1而非预期的0?

整数溢出与按位运算的异常结果解析

我定义了整数变量my_int_min并赋值为INT_MIN,发现my_int_min = -my_int_min = INT_MIN = -INT_MIN = -2147483648。预期表达式!(-my_int_min & INT_MIN)的结果为0,但实际运行结果为1。同时发现!(-my_int_min&my_int_min)等于0,(-my_int_min&INT_MIN)等于-2147483648,请问该表达式结果为何不等于0?

测试代码

#include <stdio.h>
#include <limits.h>

int main()
{
    int my_int_min = INT_MIN;
    printf("INT_MIN=%d\t my_int_min=%d\t -INT_MIN=%d\t -my_int_min=%d\n", INT_MIN, my_int_min, -INT_MIN, -my_int_min);
    printf("!(-INT_MIN&INT_MIN)=%d\t !(-my_int_min&INT_MIN)=%d\n", !(-INT_MIN&INT_MIN), !(-my_int_min&INT_MIN));
    printf("!(-INT_MIN&my_int_min)=%d\t !(-my_int_min&my_int_min)=%d\n", !(-INT_MIN&my_int_min), !(-my_int_min&my_int_min));
    printf("(-my_int_min&INT_MIN)=%d\t !(-my_int_min&INT_MIN)=%d\n", (-my_int_min&INT_MIN), !(-my_int_min&INT_MIN));

    return 0;
}

运行输出

INT_MIN=-2147483648      my_int_min=-2147483648  -INT_MIN=-2147483648    -my_int_min=-2147483648
!(-INT_MIN&INT_MIN)=0    !(-my_int_min&INT_MIN)=1
!(-INT_MIN&my_int_min)=0         !(-my_int_min&my_int_min)=0
(-my_int_min&INT_MIN)=-2147483648        !(-my_int_min&INT_MIN)=1

问题原因

1. 有符号整数溢出的未定义行为

对于32位有符号int类型,INT_MIN的二进制是最高位(符号位)为1、其余位为0的0x80000000,对应十进制-2147483648。数学上对其取反应得到2147483648,但这个值超出了32位有符号int的最大值2147483647,触发有符号整数溢出——根据C标准,这属于未定义行为,编译器可自由处理该运算,比如按补码循环特性返回原值-2147483648,或进行其他优化。

2. 编译器对常量与变量的优化差异

  • 对于-INT_MIN & INT_MIN:INT_MIN是宏定义的常量,编译器在编译阶段直接计算表达式。由于-INT_MIN被处理为-2147483648,与INT_MIN按位与的结果仍是-2147483648(非0),因此!运算后返回0,符合输出。
  • 对于-my_int_min & INT_MIN:my_int_min是变量,编译器可能进行常量折叠优化——因为它被初始化为INT_MIN,编译器识别到-my_int_min会触发未定义行为,因此将整个表达式-my_int_min & INT_MIN优化为0,此时!0返回1。但直接打印该表达式时,编译器又按补码运算逻辑返回-2147483648,这就导致了同一表达式在不同上下文的结果矛盾,本质是未定义行为的表现。

3. !运算符的规则

!运算符的逻辑是:操作数为0时返回1,非0时返回0。输出中看似矛盾的结果,完全是编译器针对未定义行为进行不同优化导致的。

内容的提问来源于stack exchange,提问作者WXll

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:40:26