我对有关此事的规则感到困惑[一个好的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)
类型转换会逐步进行.您的表达可以被视为
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 longb + a*3是一个long longc = b+a*3强制转换,因为算术操作数可以隐式地相互转换.