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

sizeof引发有符号数转无符号数的C语言运算异常排查

为什么两段C语言代码的执行结果不同?

第一段代码(不符合预期)

#include <stdio.h>
#define Const_value sizeof(int)

int i = 100;
int j;
int main(){
    j = (Const_value - i > 0);
    printf("%ld, %d, %d",Const_value, i, j);
    return 0;
}

运行输出:4, 100, 1

第二段代码(符合预期)

#include <stdio.h>
#define Const_value sizeof(int)

int i = 100;
int j;
int main(){
    int x = Const_value - i;
    j = (x > 0);
    printf("%ld, %d, %d",Const_value, i, j);
    return 0;
}

运行输出:4, 100, 0


差异原因

核心问题出在sizeof的返回类型和宏替换的特性上:

  • sizeof的返回值类型是**size_t**,这是一个无符号整数类型。
  • 宏是预编译阶段直接做文本替换,所以第一段代码里的Const_value - i等价于sizeof(int) - i,也就是size_t类型的4减去int类型的100。根据C语言的整数提升规则,int类型的100会被转换成size_t(无符号),此时计算4 - 100会按无符号整数规则处理:无符号数不会出现负数,溢出后会绕回成一个极大的正数,所以这个结果大于0,最终j=1。
  • 第二段代码中,先把Const_value - i的结果赋值给int类型的x,此时无符号的计算结果会被转换成int类型,得到正确的负数-96,再判断x>0自然为假,所以j=0。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:10:20