【发布时间】:2016-02-28 12:16:44
【问题描述】:
我在使用内置运算符时遇到了原始类型的问题。我所有的运算符都适用于除float 和(un)signed long long int 之外的所有数据类型。
为什么即使乘以一也会出错?另外,为什么+10 和-10 给出的数字与+1、-1、/1 和*1 相同。
之所以选择数字461168601,是因为它符合最大float 和最大signed long long int。
运行以下代码并得到以下输出:
fmax : 340282346638528859811704183484516925440
imax : 9223372036854775807
i : 461168601
f : 10
f2 : 1
461168601 / 10 = 46116860
461168601 + 10 = 461168608
461168601 - 10 = 461168608
461168601 * 1 = 461168608
461168601 / 1 = 461168608
461168601 + 1 = 461168608
461168601 - 1 = 461168608
下面的代码可以运行here。
#include <iostream>
#include <sstream>
#include <iomanip>
#include <limits>
#define fmax std::numeric_limits<float>::max()
#define imax std::numeric_limits<signed long long int>::max()
int main()
{
signed long long int i = 461168601;
float f = 10;
float f2 = 1;
std::cout << std::setprecision(40);
std::cout <<"fmax : " << fmax << std::endl;
std::cout <<"imax : " << imax << std::endl;
std::cout <<"i : " << i << std::endl;
std::cout <<"f : " << f << std::endl;
std::cout <<"f2 : " << f2 << std::endl;
std::cout <<std::endl;
std::cout << i << " / " << f << " = " << i / f << std::endl;
std::cout << i << " + " << f << " = " << i + f << std::endl;
std::cout << i << " - " << f << " = " << i - f << std::endl;
std::cout <<std::endl;
std::cout << i << " * " << f2 << " = " <<i * f2 << std::endl;
std::cout << i << " / " << f2 << " = " << i / f2 << std::endl;
std::cout << i << " + " << f2 << " = " << i + f2 << std::endl;
std::cout << i << " - " << f2 << " = " << i - f2 << std::endl;
}
【问题讨论】:
-
我的问题不是关于类型转换,而是不正确的结果。
-
你为什么打电话给
2**63-1FLT_MAX?这远小于浮点数的最大值,也远大于浮点数的最大精度。您的“错误”答案包括将2**62-1转换为float,从而导致2**622**62-1没有浮点表示,但2**62有浮点表示 -
@TMKelleher 你问为什么 unsigned long long int 会被转换为浮点数。
-
你犯了两个错误:第一个涉及隐式类型转换(
4611686018427387903在任何操作之前首先转换为float),第二个涉及值存储到浮点数的方式 - 不像整数类型,如果浮点数可以准确存储X的值,并不意味着它可以准确存储0和X之间的任何整数值。不可能将4611686018427387903完全存储在float中,因此您会得到最接近的值4611686018427387904,这就是您的* 1操作错误的原因(其他操作的推理相同)。
标签: c++ casting operators unsigned-long-long-int