带括号的int32和int64的算术运算

时间:2016-02-26 16:33:04

标签: c integer-arithmetic

给出了这个操作:

int64_t a_int64, b_int64 = WHATEVER1;
int32_t c_int32 = WHATEVER2;

a_int64 = b_int64 - (c_int32 * 1000000);

在乘法之前c_int32是否被提升为int64_t?我知道在任何算术运算之前,所有整数都被提升为至少'int'大小,并且如果它的排名大于int,则为二进制运算符的较大操作数的大小。但括号内的操作是否与(第二)操作分开处理,即减法?

2 个答案:

答案 0 :(得分:2)

From another good SO post on the topic

C99,§6.4.4.1

  

整数常量的类型是第一个   相应的列表,其值可以表示。

表6

int
long int
long long int

因此,c_int32的自动提升将取决于整数字面的大小。在这种情况下,在32位系统上,您的整数文字很容易适合in32_t变量。

这不是进行整数运算的好方法。让你的代码尽可能明确,不要遗漏任何机会。

a_int64 = b_int64 - ((int64_t)c_int32 * 1000000LL);

答案 1 :(得分:2)

  

但是括号内的操作是'与(第二)操作分开处理,减法?

是;评估c_int32 * 1000000所涉及的促销并不以任何方式依赖于上下文。之后,结果会发生由于该上下文而发生的任何必要转换。

尽管如此,c_int32 * 1000000只有在没有溢出的情况下才能明确定义;在这种情况下,64位促销是否在乘法之前或之后发生并不重要。因此编译器可以合法地执行它(例如,如果它看到一些优化机会)。