繁体   English   中英

将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;
}

通过这些问题,

整数类型可以在C ++中存储什么值范围

unsigned long long有多少个字节?

然后通过其他一些来源,我进行了以下更改,从而得到了所需的结果。

    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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM