将int转换为unsigned long long

时间:2016-11-21 07:37:55

标签: c++ casting int unsigned-long-long-int

我正在解决一个问题,其中任务是在用户提到的给定行输出pascal三角形的结果。

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 仍然给我有效的结果。

2 个答案:

答案 0 :(得分:3)

子格式C * (rowIndex +1 - i)可以在分割之前溢出。通过将C转换为更大的数据类型,整个表达式将成为该类型,因此乘法不会溢出。然后在使用i进行除法后,结果再次转换为int,但由于除法,它在int的范围内。

请注意,这仅适用于您当前拥有的值。如果你继续使用更高的值,那么迟早会出现无法通过此类演员修复的溢出。

答案 1 :(得分:1)

当你说

(unsigned long long)C

你没有使实际变量C成为无符号长long。你这样做只是在说

C * (rowIndex +1 - i) / i;

将C(在右侧)视为无符号长整型。也就是说,只有临时空间来保持C,然后保持它的乘法(rowIndex +1 - i),然后它与i的划分是在一个大的空间完成的。如果整个结果大于整数可以具有的值,则这也不起作用。