我对有关此事的规则感到困惑 [一个好的 URL 可能会节省回答时间]。我注意到很多时候转换是隐式工作的,但其他时候它是必需的。
例如我原以为它会起作用:
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;
最佳答案
类型转换是一步一步进行的。你的表情可以看作是
a = (b * 1000);
在 b * 1000
中,编译器(假设它很愚蠢)不知道您要将它存储到 long long
中。由于 b
和 1000 都是 int
,因此结果也将是 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
中不需要转换,因为算术操作数可以隐式地相互转换。
关于c - 根据标准,什么样的类型转换是显式冗余的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3429698/