当前位置: 首页 > 知识库问答 >
问题:

将int转换为无符号long long

顾承平
2023-03-14

我正在解决一个问题,其中的任务是在用户提到的给定行输出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;
}

通过这些问题,

整数类型可以在C中存储哪些范围的值

长到无符号的字节数是多少?

并通过其他一些来源,我进行了以下更改,这给了我所需的结果。

    C = (unsigned long long)C * (rowIndex +1 - i) / i;

由于“C”是int类型,而我的向量v存储int,我想知道为什么一个长长度的无符号仍然会给我有效的结果。

共有2个答案

艾凌龙
2023-03-14

当你说

(unsigned long long)C

你没有把实际变量C变成一个无符号的long long。你只是在这样做的时候说。

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

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

韦安怡
2023-03-14

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

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

 类似资料:
  • 为什么在C 11中无符号短*无符号短转换为int? int太小,无法处理这行代码显示的最大值。 MinGW 4.9.2溢流 因为(来源) USHRT_MAX=65535 (2^16-1)或更大* INT_MAX=32767 (2^15-1)或更大* 和(2^16-1)*(2^16-1)=~2^32。 这个解决方案会有什么问题吗? 此程序 给出输出 在…上 两者都有 这证明在这些编译器上,被转换为。

  • 问题内容: 使用Swift,我试图获取应用程序文本视图中输入的数字列表,并通过为成绩计算器提取每个数字来创建此列表的总和。而且,用户输入的值量每次都会更改。一个例子如下所示: 字符串:98,99,97,96 …试图获取:98 + 99 + 97 + 96 … 请帮忙!谢谢 问题答案: 使用打破了逗号分隔的字符串。 使用前,每一个元素后删除空格 使用每个元素转换为整数。 使用(以前称为)删除所有无法

  • 问题内容: 我需要将数字转换为无符号字节。该数字始终小于或等于255,因此它将适合一个字节。 我还需要将该字节转换回该数字。我将如何用Java做到这一点?我尝试了几种方法,但均无效果。这是我现在想要做的: 现在将该字节转换回数字: 显然,这是行不通的。由于某种原因,它总是将数字转换为。有什么建议? 问题答案: 字节始终用Java签名。但是,您可以通过将二进制与0xFF相乘来获得其无符号值:

  • 问题内容: 在C语言中,我可以使用数字做一些技巧: 在Swift中有没有办法做到这一点?请注意,相同的方法无效: 有没有一种方法可以让C的行为在Swift中减法? 谢谢! 问题答案: 所有有符号和无符号整数类型都有一个构造函数,该构造函数从具有相同内存表示形式的有符号(反之亦然)创建无符号数字:

  • 注意:这个问题包含不建议使用的前1.0代码!不过,答案是正确的。 要在Rust中将转换为,我可以执行以下操作: 我知道如何将转换为的唯一方法是获取其中的一个片段,然后像这样使用: 有没有办法直接将转换为?

  • 我想找到将转换为的最快方法。完整的问题是将形式为HHMMSSxxxxxxxxx时间戳的转换为纳秒,其中分配后约50个字节,可以安全地读取(但不能写入)。我们只关心这个问题中的最后9位数字。 版本1是基本版本,版本2,3尝试保存一些计算。我使用-O3标志编译,在数组中存储10s的能力很好,因为它经过了优化(使用Godbolt检查)。 我怎样才能更快?是的,我知道这听起来像是过早的优化,但让我们假设我