C89和C99中的隐式转换?

我正在读这本书;C语言编程的现代方法;K.N.King。有人写道,隐式转换只有在

  1. 如果一个操作数的类型大于另一个操作数(伪代码)长d+短r

  2. 无符号类型的操作数的秩等于或大于有符号操作数的秩(伪代码)整数a+无符号整数b

  3. 有符号操作数可以包含无符号操作数(伪代码)长x+无符号短y的任何值

  4. 当我们将int添加到float或long添加到float时。长到双倍等等

但后来我写了一段代码,然后写了出来

inta;
短b=10000,c=150;
a=b*c;
printf(产品结果为%d\n,a);

我得到了正确答案150000。为什么?我有两个相同类型的操作数,不必进行隐式转换。我没有使用显式转换。有趣的是,有一点晚了

int j=1000;
长i=(长)(j*j);

此代码可能会在某些类型的计算机(可能是嵌入式系统)上产生错误的结果,因为j*j是首先计算的,结果是int,但int不能容纳大于500.000的数字,例如,转换将延迟。我理解这一点(选角晚了),但事实上,我也这么做了,但我得到了另一个

如果书中说隐式转换只在这些条件下发生,那就错了。在整数算术运算(和其他一些运算)中,秩小于int无符号int的操作数至少转换为int无符号int。(正式规则有额外的挑剔细节。)因此,在b*c中,short操作数bc被提升为int,结果类型为int。数学结果1500000适合C实现中的int,因此没有溢出

发表评论