将 int 转换为 unsigned long long

Posted

技术标签:

【中文标题】将 int 转换为 unsigned long long【英文标题】:casting int to unsigned long long 【发布时间】:2016-11-21 07:37:54 【问题描述】:

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

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

【问题讨论】:

只是猜测...可能是因为除以i 后,该值又回到了int 为完整且合法值的区域? 【参考方案1】:

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

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

【讨论】:

我对如何将 unsigned long long 值存储在 int 变量中感到困惑......感觉很愚蠢,因为我的头很长一段时间。【参考方案2】:

当你说

(unsigned long long)C

您没有将实际变量 C 设为 unsigned long long。你只是说这样做的时候

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

将 C(在右侧)视为 unsigned long long。也就是说,只有临时空间存放 C,然后存放它与 (rowIndex +1 - i) 的乘法,然后它与 i 的除法在那么大的空间完成。如果整个结果大于整数可以具有的值,这也不起作用。

【讨论】:

非常担心将 unsigned long long 向上转换为 int 我最终没有意识到该值可能会落在该范围内......

以上是关于将 int 转换为 unsigned long long的主要内容,如果未能解决你的问题,请参考以下文章

将 int 转换为 unsigned long long

将 Long 转换为 Unsigned Short Int / Strtol

使用联合将 char 数组读取为 unsigned long int

在 c语言中int long unsigned 和 char这四种类型数据的转换规律是_____.

如何将 const void* 转换为 unsigned int?

c语言中如何将short,int,long,float这些类型的数值转换为字符串?