C89 和 C99 中的隐式转换?
Implicit conversion in C89 and C99?
我正在阅读《C 编程的现代方法》一书 K.N.King。据记载,只有在
时才会发生隐式转换
如果一个操作数的类型大于另一个操作数。 (pseudocode) long d + short r
无符号类型操作数的等级等于或大于有符号操作数的等级。 (pseudocode) int a + unsigned int b
有符号操作数可以包含无符号操作数的任意值(pseudocode) long long x + unsigned short y
当我们将 int 添加到 float 或将 long 添加到 float 时。 long long to double 等等。
但是后来我在写代码写的
int a;
short b=10000 ,c= 150;
a = b * c;
printf("result of product is %d\n", a );
我答对了 150000。为什么?我有两个相同类型的操作数,并且不必进行隐式转换。我没有使用显式转换。有趣的是,后面写的是
int j = 1000;
long i = (long) (j * j);
此代码可能会在某些类型的计算机或嵌入式系统上产生错误的结果,因为 j * j
首先计算,结果是 int,但 int 不能例如,持有大于 500.000 的数字,铸造将延迟。我明白(选角晚了),但事实上,我也做了同样的事情,但我得到了另一个。
如果书上说隐式转换只在那些条件下发生,那是错误的。在整数算术运算(和其他一些)中,秩小于 int
或 unsigned int
的操作数至少转换为 int
或 unsigned int
。 (正式规则有额外的挑剔细节。)因此,在 b * c
中,short
操作数 b
和 c
被提升为 int
,并且结果类型是 int
。数学结果 1,500,000 适合您的 C 实现中的 int
,因此没有溢出。
我正在阅读《C 编程的现代方法》一书 K.N.King。据记载,只有在
时才会发生隐式转换如果一个操作数的类型大于另一个操作数。
(pseudocode) long d + short r
无符号类型操作数的等级等于或大于有符号操作数的等级。
(pseudocode) int a + unsigned int b
有符号操作数可以包含无符号操作数的任意值
(pseudocode) long long x + unsigned short y
当我们将 int 添加到 float 或将 long 添加到 float 时。 long long to double 等等。
但是后来我在写代码写的
int a;
short b=10000 ,c= 150;
a = b * c;
printf("result of product is %d\n", a );
我答对了 150000。为什么?我有两个相同类型的操作数,并且不必进行隐式转换。我没有使用显式转换。有趣的是,后面写的是
int j = 1000;
long i = (long) (j * j);
此代码可能会在某些类型的计算机或嵌入式系统上产生错误的结果,因为 j * j
首先计算,结果是 int,但 int 不能例如,持有大于 500.000 的数字,铸造将延迟。我明白(选角晚了),但事实上,我也做了同样的事情,但我得到了另一个。
如果书上说隐式转换只在那些条件下发生,那是错误的。在整数算术运算(和其他一些)中,秩小于 int
或 unsigned int
的操作数至少转换为 int
或 unsigned int
。 (正式规则有额外的挑剔细节。)因此,在 b * c
中,short
操作数 b
和 c
被提升为 int
,并且结果类型是 int
。数学结果 1,500,000 适合您的 C 实现中的 int
,因此没有溢出。