为什么双精度不存储两个整数的乘积
Why double is not storing the product of two int
我正在尝试学习数字如何在计算机内存中存储的基本知识。因此,我最近拿起了C++。我写了下面的函数,来计算任何整数值的平方。
// since integer can go upto 65K value, hence the return
// value is double to accomodate the square of highest int value.
double square(int val) {
return val*val;
}
为什么它给了我一个错误的答案65535
,根据我的理解,这是可以存储在int
型变量中的最大数字?我还发现有这样的事情:
std::numeric_limits<int>::max()
这给了我2147483647
.这反过来又让我更加困惑,但我正在寻找解释为什么我的square
功能失败。
编辑
对于65535
我的g++
编译器给我:-131071
.
您在此处已签名整数溢出,这是未定义的行为。 你说std::numeric_limits<int>::max()
给了2147483647
,既然65535
少了,那么你觉得你应该没事。 问题是你不是。 当您乘以int
时,结果存储在int
中(即使这不是您分配给它的内容)。 由于65535 * 65535
4294836225
因此会溢出结果。
解决此问题的唯一方法是使用可以保存结果的更宽/更大的类型。 例如,如果你乘以两个long long
,你可以做65535 * 65535
就可以了。
只要乘法中至少有一个变量的类型足够大以存储结果,那么你就可以了。 所以在这种情况下,两者
val * static_cast<double>(val)
和
val * static_cast<long long>(val)
会给你正确的结果。 您也可以将val
更改为双精度,这也将解决问题。
相关文章:
- C++需要帮助从用户那里获得一个整数,并确保它在另外两个整数之间
- 比较C++中两个整数的最有效和最干净的方法是什么?
- 如何将字符串和整数读取到两个单独的动态数组中的程序编写?
- 为什么将两个浮点数相加会得到一个整数C++?
- 从两个 4x64 位整数数组中获取取模
- 为什么 Clang 和 GCC 中两个无符号整数之和的结果类型不同
- 比较两个整数在C++中与未知 int 类型的相等性
- 创建整数的 2D 数组,该数组将使用两个函数用随机数填充矩阵.我做错了什么?
- 如何组合两个整数向量
- 在两个整数之间交换最右边的N位
- 打印出两个整数之间的偶数
- 为什么将两个总和为 32k >整数相加时得到负数?
- C++ 两个线程,共享几个整数变量
- Python 等效代码,可像C++一样直接附加两个整数
- 是否有任何内置函数可以检查给定的两个数字在给定整数数组中的顺序是否相同?
- 移位运算符如何在查找两个整数中的不同位数?
- 如何安全地比较两个无符号整数计数器?
- 添加两个二进制数(整数数组)
- 运算符"|"如何计算两个整数?
- 如何找出在两个整数的乘积中设置了多少位(等于 1)