带括号的int32和int64的算术运算
Arithmetic operation on int32 and int64 with parentheses
鉴于此操作:
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,则提升到二元运算符的较大操作数的大小。但是括号内的操作是否与(第二个)操作,即减法分开处理?
From another good SO post on the topic:
C99,§6.4.4.1
The type of an integer constant is the first of the
corresponding list in which its value can be represented.
Table 6
int
long int
long long int
所以,c_int32
的自动提升将取决于整型字面量的大小。在这种情况下,在 32 位系统上,您的整型文字很容易适合 in32_t
变量。
这不是进行整数运算的好方法。使您的代码尽可能明确,不要留下任何机会。
a_int64 = b_int64 - ((int64_t)c_int32 * 1000000LL);
But are operations inside parentheses' are handled separately from the (second) operation, the substraction?
是;评估 c_int32 * 1000000
所涉及的促销活动不以任何方式取决于上下文。之后,由于该上下文而导致的任何必要转换都会发生在结果上。
就是说,c_int32 * 1000000
只有在不溢出的情况下才是明确定义的;在这种情况下,64 位提升发生在乘法之前还是之后并不重要。因此编译器可以合法地以任何一种方式进行(例如,如果它看到一些优化机会)。
鉴于此操作:
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,则提升到二元运算符的较大操作数的大小。但是括号内的操作是否与(第二个)操作,即减法分开处理?
From another good SO post on the topic:
C99,§6.4.4.1
The type of an integer constant is the first of the corresponding list in which its value can be represented.
Table 6
int
long int
long long int
所以,c_int32
的自动提升将取决于整型字面量的大小。在这种情况下,在 32 位系统上,您的整型文字很容易适合 in32_t
变量。
这不是进行整数运算的好方法。使您的代码尽可能明确,不要留下任何机会。
a_int64 = b_int64 - ((int64_t)c_int32 * 1000000LL);
But are operations inside parentheses' are handled separately from the (second) operation, the substraction?
是;评估 c_int32 * 1000000
所涉及的促销活动不以任何方式取决于上下文。之后,由于该上下文而导致的任何必要转换都会发生在结果上。
就是说,c_int32 * 1000000
只有在不溢出的情况下才是明确定义的;在这种情况下,64 位提升发生在乘法之前还是之后并不重要。因此编译器可以合法地以任何一种方式进行(例如,如果它看到一些优化机会)。