我对有关此事的规则感到困惑[一个好的网址可能会节省回答的时间]。我注意到很多时间转换隐含地起作用,但其他时候它是必需的。
e.g。我原以为它会起作用:
long long a;
int b;
[..]
a = b * 1000;
但事实证明,'a'溢出并且需要
a = (long long) b * 1000;
这是奇特的,因为'a'是我曾预期会打扰的'大'。
无论如何,除了这个例子,您是否知道有关此事的全面信息来源?没有'大部分时间都没问题',这让我变得偏执。
编辑:这只是'第二部分首先进行计算并且溢出,遵循该规则'的问题吗?
EDIT2:如果有计算,例如
long long a;
int b;
short c;
[..]
c = b + a * 3;
,会做什么
c = b + (int) a * 3;
确保正确转换?
还是需要
c = (short) b + (int) a * 3;
或者,是否足够
c = (short) b + a * 3;
答案 0 :(得分:6)
类型转换会逐步进行。您的表达可以被视为
a = (b * 1000);
在b * 1000
中的,编译器(假装它是愚蠢的)不知道你将把它存储到long long
中。由于b
和1000都是int
s,因此结果也是int
。 a
有多大并不重要。
你可以通过使1000成为long long
来避免演员表。
a = b * 1000LL;
编辑:对于你的编辑2:
a
是long long
,b
是int
,3
是int
。a * 3
是long long
b + a*3
是long long
c = b+a*3
中不需要强制转换,因为算术操作数可以隐式转换为彼此。