![](/img/trans.png)
[英]Casting an unsigned long long int to signed long long int Is it possible?
[英]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;
}
通过这些问题,
然后通过其他一些来源,我进行了以下更改,从而得到了所需的结果。
C = (unsigned long long)C * (rowIndex +1 - i) / i;
由于“ C”的类型为int,而我的向量v存储为int ,因此我想知道为什么长时间无符号强制转换仍会给我有效的结果。
子表达式C * (rowIndex +1 - i)
可能在除法之前溢出 。 通过将C
转换为更大的数据类型,则整个表达式将变为该类型,因此乘法不会溢出。 然后,在用i
除之后,结果再次转换为int
,但是由于除,它在int
范围内。
请注意,这仅适用于您当前拥有的值。 如果继续使用更高的值,那么迟早会有这样的强制转换无法解决的溢出。
当你说
(unsigned long long)C
您并未将实际变量C设为无符号长整型。 你只是在说这件事
C * (rowIndex +1 - i) / i;
将C(在右侧)视为unsigned long long。 也就是说,只有临时空间可以容纳C,然后将其与(rowIndex +1-i)相乘,然后与i进行除法是在那么大的空间上进行的。 如果整个结果大于整数可以具有的值,那么这也不起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.