【发布时间】:2017-05-18 18:53:01
【问题描述】:
假设我有 3 个变量:long、int 和 short。
long l;
int i;
short s;
long lsum;
如果这是一个纯数学,由于乘法具有交换性质,这些变量的顺序无关紧要。
l * i * s = i * s * l = s * i * l.
让lsum成为这3个变量相乘的容器。
在 C 语言中,会不会出现这些变量的特定顺序导致不同结果的情况?
如果存在顺序确实重要的情况,不一定来自此示例,那会是什么?
【问题讨论】:
-
(
s*i) 转换为 int,然后将(s*i) * l转换为 long。(l*i)转换为 long,然后(l*i)* s也转换为 long。如果s*i溢出 int_max,那么顺序会有所不同。 -
@aka.nice - 从您的 cmets 看来,类型提升是按顺序进行的,如果从小到大可能会溢出。如果是这样的话,一开始就从最大的类型开始是正确的做法。
-
@Nguaial:不会有溢出,但会有未定义的行为。 “大”是什么意思?不能保证
int小于long。 -
@aka.nice "(s*i) 转换为 int" 不够清晰。
s首先转换为int。然后乘法发生。 -
@Nguaial Max of long is higher than max of int. 不完全是:
LONG_MAX >= INT_MAX。那是>=而不是>。
标签: c integer-promotion