如果我尝试在 c++ 中将大于 pow(2,64)-1 的值分配给无符号长整型怎么办?
What if I try to assign values greater than pow(2,64)-1 to unsigned long long in c++?
如果我有两个无符号长长值,比如 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)
相关文章:
- 将数组的地址分配给变量并删除
- vector.resize()中的分配错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- Win32编译器选项和内存分配
- 函数中堆分配的效果与缺少堆分配的情况
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 获取字符串的长度并将其分配给数组
- 将地址分配给本地指针后,公共对象的变量将消失
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 我在二维向量中是否正确分配了内存
- 正在尝试重载二进制搜索树分配运算符
- GlobalAlloc而不是其他分配方法
- 自定义先决条件对移动分配运算符有效吗
- 我可以重新分配/覆盖std::字符串吗
- 在c++中使用动态分配的问题
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- 为什么我可以使用比分配的内存更多的内存
- 如果我尝试在 c++ 中将大于 pow(2,64)-1 的值分配给无符号长整型怎么办?