多少级显式转换?
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 + 1
是long long
和int
相加,所以结果是long long
。然后 n * (...)
是 int
和 long 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;
代码片段#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 + 1
是long long
和int
相加,所以结果是long long
。然后 n * (...)
是 int
和 long 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;