可能这是一个基本问题。但我无法弄清楚,并找到答案。
我知道int
的最高编号为:-2147483648
当我通过该限制时,编译器始终显示最高值。
对float
而言:3.4e+38
(或减号,但不是重点)
当我传递float的限制时,编译器始终显示inf
。为什么不3.4e+38
或-3.4e-38
???
我的代码是这样的:
int bytesT=8*5;
int a=0;
for (int i=0; i<bytesT; i++)
{
a += pow(2, i);
}
std::cout << "a = " << a << std::endl;
float b= 3.4 * pow(10, 39);
std::cout << "b = " << b << std::endl;
它给了我那个结果:
a = -2147483648
b = inf
有人可以解释这种行为吗?提前谢谢。
答案 0 :(得分:1)
float
代表一个大于相应浮点类型可能容纳的值。因此,如果3.4e+38
的最高值为3.4 * pow(10, 39)
,则39
会更大(请注意float
),以便inf
将此值表示为特殊值3.4 * pow(10, 38)
。但是,如果您编写<limits>
,您将获得(几乎)最高值。
实际最高(和最低)数字在#include <limits>
int main() {
float b= 3.4 * pow(10, 38);
float c= std::numeric_limits<float>::max();
cout << b << " " << c << endl;
int imax = std::numeric_limits<int>::max();
int imin = std::numeric_limits<int>::min();
cout << imin << " " << imax << endl;
}
中提供:
a += pow(2, i)
这可以避免整数溢出,您可以使用id
在代码中获得整数溢出。请注意,整数溢出是未定义的行为,并且 - 即使它经常工作&#34;按预期&#34; - 不保证完全可以工作。根据C ++ 11标准的第5/4段(关于任何表达式):
如果在评估表达式期间,结果不是 在数学上定义或不在可表示值的范围内 它的类型,行为是未定义的。 [...]
答案 1 :(得分:0)
整数通常不具有“无限”或任何其他标记状态。他们只有价值观。你在这里用2的幂做的是将比特逐个设置为1,int为32bit。这意味着你最终得到的值是两个补码是signed int可以拥有的最小值。如果值是无符号的,那么它将是最大的。如果添加到32位值,则在最低32位中具有全零的值不会发生任何变化。所以你最终会得到这个价值。
(IEEE)浮点值的工作方式不同。它们具有指示无穷大的标志,而不是数字等。因此,当值超出界限时使用它们是有意义的。这就是为什么当你添加太多数字并且值超出界限时你最终会使用inf。
如果你继续向int变量添加1,你会发现它不会保留在任何单个值中。它会溢出并继续前进。我不确定C ++规范定义了多少应该如何处理它们,所以它甚至可能是特定于实现的,但通常值溢出并继续保持不变。
答案 2 :(得分:0)
I'm gonna try to make this as simple as possible:
int = 32 bits:
0000 0000 0000 0000 0000 0000 0000 0000
left-most bit represents sign, so largest int32 number that you can have is:
0111 1111 1111 1111 1111 1111 1111 1111 (which is 2147483647)
for negative numbers if left-most bit is set to 1 then to get "human readable"
number you will have to do complement 2 of that number which is invert every bit
and add 1.
ex.
1111 1111 1111 1111 1111 1111 1111 1111 <- my number (i know it is negative, -?)
0000 0000 0000 0000 0000 0000 0000 0000 <- all bits converted
0000 0000 0000 0000 0000 0000 0000 0001 <- added 1
=> so that begging number was -1
Now that you know this, question is what happens if you add 1 to the
largest positive int32 number (0111 1111 1111 1111 1111 1111 1111 1111) ?
Well you will get 1000 0000 0000 0000 0000 0000 0000 0000
which is (-2147483648). What happened here was overflow caused by addition.
This was the case in your program for your 'a' variable.
- As for your confusion with 'inf':
Floating point numbers work differently then integers.
I'm not gonna go into too much detail on how bits and bytes are arranged.
Just know that there is :
- 1 bit reserved for sign (top-left)
- next 8 (for float32) bits for exponent
- and the rest for fraction
Now what is interesting is that there are certain 'special' values defined in
IEEE 754 which are the following:
- +0 = 0 00000000 00000000000000000000000
- -0 = 1 00000000 00000000000000000000000
- +inf = 0 11111111 00000000000000000000000
- -inf = 1 11111111 00000000000000000000000
- NaN = 0 11111111 00000000000000000000001
As you see these special values are not defined in int type which is the reason
why you get 'inf' in float and something weird/unexpected in int.
I hope i answered your question.