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
相关产品推荐
相关产品推荐

