根据标准,哪种类型的转换明显多余?

时间:2010-08-07 08:15:31

标签: c

我对有关此事的规则感到困惑[一个好的网址可能会节省回答的时间]。我注意到很多时间转换隐含地起作用,但其他时候它是必需的。

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; 

1 个答案:

答案 0 :(得分:6)

类型转换会逐步进行。您的表达可以被视为

a = (b * 1000);
b * 1000中的

,编译器(假装它是愚蠢的)不知道你将把它存储到long long中。由于b和1000都是int s,因此结果也是inta有多大并不重要。

你可以通过使1000成为long long来避免演员表。

a = b * 1000LL;

编辑:对于你的编辑2:

  • along longbint3int
  • 因此,a * 3long long
  • 因此,b + a*3long long
  • c = b+a*3中不需要强制转换,因为算术操作数可以隐式转换为彼此。