将 int 转换为 unsigned long long
casting int to unsigned long long
我正在解决一个问题,其中的任务是在用户提到的给定行输出帕斯卡三角形的结果。
https://leetcode.com/problems/pascals-triangle-ii/
我编写的解决方案在存储巨大的阶乘结果时存在问题。
vector<int> getRow(int rowIndex) {
vector<int> v;
int C = 1;
v.push_back(1);
for (int i = 1; i <= rowIndex; i++)
{
printf("%d ", C);
C = C * (rowIndex +1 - i) / i;
v.push_back(C);
}
return v;
}
在回答这些问题时,
What range of values can integer types store in C++
How many bytes is unsigned long long?
通过其他一些资源,我进行了以下更改,得到了所需的结果。
C = (unsigned long long)C * (rowIndex +1 - i) / i;
因为 "C" 的类型是 int 并且我的向量 v 存储 int,我想知道为什么要强制转换unsigned long long 仍然给我有效的结果。
子表达式 C * (rowIndex +1 - i)
可以 溢出 在除法之前。通过将 C
转换为更大的数据类型,整个表达式将变为该类型,因此乘法不会溢出。然后在用 i
除法后,结果再次转换为 int
,但由于除法,它在 int
.
的范围内
请注意,这仅适用于您当前拥有的值。如果您继续使用更高的值,那么您迟早会遇到无法通过此类转换修复的溢出。
当你说
(unsigned long long)C
您没有将实际变量 C 设为 unsigned long long。你这样做的时候只是在说
C * (rowIndex +1 - i) / i;
将 C(右侧)视为 unsigned long long。也就是说,只有临时 space 保存 C,然后保存它与 (rowIndex +1 - i) 的乘法,然后它与 i 的除法在 space 那么大。如果整个结果大于整数可以具有的值,这也不起作用。
我正在解决一个问题,其中的任务是在用户提到的给定行输出帕斯卡三角形的结果。
https://leetcode.com/problems/pascals-triangle-ii/
我编写的解决方案在存储巨大的阶乘结果时存在问题。
vector<int> getRow(int rowIndex) {
vector<int> v;
int C = 1;
v.push_back(1);
for (int i = 1; i <= rowIndex; i++)
{
printf("%d ", C);
C = C * (rowIndex +1 - i) / i;
v.push_back(C);
}
return v;
}
在回答这些问题时,
What range of values can integer types store in C++
How many bytes is unsigned long long?
通过其他一些资源,我进行了以下更改,得到了所需的结果。
C = (unsigned long long)C * (rowIndex +1 - i) / i;
因为 "C" 的类型是 int 并且我的向量 v 存储 int,我想知道为什么要强制转换unsigned long long 仍然给我有效的结果。
子表达式 C * (rowIndex +1 - i)
可以 溢出 在除法之前。通过将 C
转换为更大的数据类型,整个表达式将变为该类型,因此乘法不会溢出。然后在用 i
除法后,结果再次转换为 int
,但由于除法,它在 int
.
请注意,这仅适用于您当前拥有的值。如果您继续使用更高的值,那么您迟早会遇到无法通过此类转换修复的溢出。
当你说
(unsigned long long)C
您没有将实际变量 C 设为 unsigned long long。你这样做的时候只是在说
C * (rowIndex +1 - i) / i;
将 C(右侧)视为 unsigned long long。也就是说,只有临时 space 保存 C,然后保存它与 (rowIndex +1 - i) 的乘法,然后它与 i 的除法在 space 那么大。如果整个结果大于整数可以具有的值,这也不起作用。