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

j r*_*riv 3 c

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

例如,我曾预料到它会起作用:

long long a;
int b;
[..]
a = b * 1000;
Run Code Online (Sandbox Code Playgroud)

但事实证明,'a'溢出并且它是必需的

a = (long long) b * 1000;
Run Code Online (Sandbox Code Playgroud)

这是特殊的,因为'a'是我认为它会打扰的'大'.

无论如何,除了这个例子,您是否知道有关此事的全面信息来源?没有"大部分时间都没事",这让我变得偏执.

编辑:这只是'第二部分首先进行计算并且溢出,遵循该规则'的问题吗?

EDIT2:如果有计算如

long long a;
int b;
short c;
[..]
c = b + a * 3;
Run Code Online (Sandbox Code Playgroud)

,会做的

c = b + (int) a * 3; 
Run Code Online (Sandbox Code Playgroud)

确保正确转换?

还是需要呢?

c = (short) b + (int) a * 3; 
Run Code Online (Sandbox Code Playgroud)

或者,它是否足够

c = (short) b + a * 3; 
Run Code Online (Sandbox Code Playgroud)

ken*_*ytm 6

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

a = (b * 1000);
Run Code Online (Sandbox Code Playgroud)

b * 1000,编译器(让我们假装它是愚蠢的)不知道你将它存储到一个long long.由于两者都是b1000 int,因此结果int也是.这有多大a无关紧要.

你可以通过1000 a来避免演员阵容long long.

a = b * 1000LL;
Run Code Online (Sandbox Code Playgroud)

编辑:为您的编辑2:

  • a是一个long long,b是一个int,3是一个int.
  • 因此,a * 3是一个long long
  • 因此,b + a*3是一个long long
  • 但是不需要c = b+a*3强制转换,因为算术操作数可以隐式地相互转换.