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

为何int变量赋值0.1后与0.1比较为假,以及SIZE宏与-1比较为假?

为何int变量赋值0.1后与0.1比较为假,以及SIZE宏与-1比较为假?

我来帮你拆解这两个看起来有点反直觉的问题,咱们结合你的代码一步步捋清楚~

第一个问题:int i = .1; 后 i == .1 输出False

先看你给int变量i赋值.1的操作:.1本身是double类型的浮点数,当你把它赋值给int类型的变量时,C语言会做「截断转换」——直接把小数部分丢掉,只保留整数部分,所以i实际存的值是0,你可以在代码里加一句printf("i的值是:%d\n", i);验证,肯定输出0。

接下来到比较环节if(i == .1):这里i是int类型,而.1还是double类型,C语言会自动把int类型的i转换为double类型,也就是0变成0.0,然后和0.1(double)比较,0.0和0.1显然不相等,所以条件不成立,输出False。

第二个问题:SIZE宏与-1比较输出False

先看你的SIZE宏定义:#define SIZE (sizeof(arr)/sizeof(arr[0])),这里的sizeof运算符返回的类型是size_t——这是C语言专门用来表示内存大小的无符号整数类型(简单说就是只能存非负数)。你的数组arr有7个元素,所以SIZE的实际值是7,类型是size_t。

然后看比较if(-1 == SIZE):这里涉及到C语言的类型提升规则:当有符号数和无符号数比较时,会把有符号数转换成无符号数。-1是int类型的有符号数,转换成size_t类型时,会变成该类型能表示的最大值(比如64位系统下是18446744073709551615,32位系统是4294967295),而SIZE的值是7,7和这个超大的数当然不相等,所以条件不成立,输出False。

另外你代码里的printf("%ld\n", sizeof(SIZE));,其实sizeof(SIZE)就是sizeof(size_t),64位系统下输出8,32位输出4,这也能侧面说明SIZE的类型是无符号的大整数类型。

备注:内容来源于stack exchange,提问作者dinesh babu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 08:37:57