【问题标题】:What if I try to assign values greater than pow(2,64)-1 to unsigned long long in c++?如果我尝试在 c++ 中将大于 pow(2,64)-1 的值分配给 unsigned long long 怎么办?
【发布时间】:2014-01-07 18:57:11
【问题描述】:

如果我有两个 unsigned long long 值说 pow(10,18) 和 pow (10,19),我将它们相乘并将输出存储在另一个 unsigned long long 类型的变量中......我们得到的值是显然不是答案,但它有什么逻辑吗?每次我们尝试使用任意大的数字时都会得到一个垃圾类型的值,但是输出与输入值有什么逻辑吗?

【问题讨论】:

标签: c++ variables types range


【解决方案1】:

C++ 中的无符号整数类型遵循模运算规则,即它们表示整数模 2N,其中 N 是数字整数类型的值位(可能小于其sizeof 乘以CHAR_BIT);具体来说,该类型保存值 [0, 2N)。

因此,当您将两个数字相乘时,结果是数学结果除以 2N 的余数。

数字 N 可通过std::numeric_limits<T>::digits 以编程方式获得。

【讨论】:

  • +1 以获得完整的答案,其中还提到了 CHAR_BIT
  • 感谢您的回答。
【解决方案2】:

是的,有一个逻辑。

正如 KerreK 所写,整数被“包裹”在构成其数据类型宽度的 2N 位上。

为方便起见,让我们考虑以下几点:

#include <iostream>
#include <cmath>
using namespace std;

int main() {

    unsigned char tot;

    unsigned char ca = 200;
    unsigned char ca2 = 200;

    tot = ca * ca2;

    cout << (int)tot;

    return 0;
}

(试试看:http://ideone.com/nWDYjO

在上面的例子中,一个 unsigned char 是 1 字节宽(最大 255 个十进制值),当乘以 200 * 200 时,我们得到 40000。如果我们尝试将它存储到 unsigned char 中,它显然不适合。

然后将值“环绕”,即tot得到下面的结果

(ca*ca2) % 256

其中 256 是无符号字符的位(1 个字节),28

在你的情况下,你会得到

(pow(10,18) * pow (10,19)) % 2number_of_bits_of_unsigned_long_long(architecture_dependent)

【讨论】:

  • btw 在 C++ 中最好使用#include &lt;cmath&gt; 而不是#include &lt;math.h&gt;
  • 我同意,已修复。谢谢!
  • 为了迂腐,N 不一定是类型的宽度。一般来说,可能会有填充。只有char 类型和intNN_t/uintNN_t 类型保证没有填充。
猜你喜欢
  • 1970-01-01
  • 2011-04-23
  • 2012-01-27
  • 2021-05-07
  • 1970-01-01
  • 1970-01-01
  • 2014-05-27
  • 2011-10-26
  • 2019-11-24
相关资源
最近更新 更多