如果我尝试在 c++ 中将大于 pow(2,64)-1 的值分配给无符号长整型怎么办?

What if I try to assign values greater than pow(2,64)-1 to unsigned long long in c++?

本文关键字:分配 怎么办 长整型 无符号 c++ pow 大于 如果      更新时间:2023-10-16

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

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

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

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

是的,有一个逻辑。

正如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)

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

然后将该值"环绕",即 tot 得到以下结果

(ca*ca2) % 256

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

在您的情况下,您会得到

战俘(10,18) * 战俘(10,19)) % 2number_of_bits_of_unsigned_long_long(architecture_dependent)