多少级显式转换?

How many levels of explicit casting?

代码片段#1.

int n = 46341;
long long value = ((long long) (n * (n + 1))) / 2;
std::cout << value; // -1073716337 -- WRONG!

代码片段#2.

int n = 46341;
long long value = (long long)((long long)((long long)n * ((long long)n + 1))) / 2;
std::cout << value; // 1073767311 -- CORRECT!

需要多少级显式转换才能产生所需的结果?

一个。作为一般规则,算术表达式的结果将采用两者中较大者的类型。

long long value = (n * (static_cast<long long>(n) + 1)) / 2;

所以(long long)n + 1long longint相加,所以结果是long long。然后 n * (...)intlong long 的乘法,所以我们再次取较大的,依此类推。

但是,正如评论中所指出的,您可能应该做一个临时的,以便将铸造恶作剧与实际数学分开。

long long n0 = n;
long long value = (n0 * (n0 + 1)) / 2;

现在有两行:一行将变量转换为更大的类型,另一行是纯数学。它一目了然地更具可读性。

注意:我使用 static_cast 而不是旧的 C-style 语法。您可以在 Whosebug 及其姊妹网站上 find several questions 了解为什么这是一个好主意,所以我不会在这里重复这个推理,只是指出这是一个好主意。

在此声明中

long long value = (long long)((long long)((long long)n * ((long long)n + 1))) / 2;

多余的铸件太多。

你可以只写例如

long long value = n * ( n + 1LL ) / 2;

long long value = static_cast<long long>( n ) * ( n + 1 ) / 2;

这里有一个演示程序。

#include <iostream>

int main()
{
    int n = 46341;

    long long value = n * ( n + 1LL ) / 2;

    std::cout << "value = " << value << '\n';

    value = static_cast< long long >( n ) * ( n + 1 ) / 2;

    std::cout << "value = " << value << '\n';
}

程序输出为

value = 1073767311
value = 1073767311

也就是说,使用 long long 类型表达式的操作数之一就足够了,其他操作数将由于通常的算术转换而隐式转换为该类型。

How many levels of explicit casting are necessary to produce the desired result?

如果改用隐式转换,则需要零级转换:

int n = 46341;
long long nl = n;
long long value = ((nl * (nl + 1))) / 2;