众所周知,当整数变量超出其范围时,它从负数的另一端开始。
例如
int a=2147483648;
printf("%d",a);
输出:
-2147483648(正如我所料)
现在我尝试了相同的浮点数 例如
float a=3.4e39;//as largest float is 3.4e38
printf("%f",a);
OUTOUT:
1.#INF00(我期待一些负浮动值)
我没有完全得到上面的输出,但我知道它代表正无穷大
所以我的问题就是它为什么不从另一端开始(负值如整数)?
答案 0 :(得分:5)
浮点数以不同于整数的格式存储,并且不遵循相同的过度/不足流动机制。
更具体地说,2147483648
的二进制位模式是1000000000000000
,它在two's complement system中(就像几乎所有现代计算机上使用的那个一样)与{{1}相同}。
今天大多数计算机使用IEEE754格式表示浮点值,这些处理方式与普通整数完全不同。
答案 1 :(得分:3)
在IEEE-754中,最大有限float
(二进制-32)值低于double
值3.4e39
。
IEEE-754说(对于默认的舍入方向属性roundTiesToEven):
(IEEE-754:2008,4.3.1舍入方向属性最接近)“在以下两个舍入方向属性中,无限精确的结果至少具有幅度 b emax(b - ½b1-p)应舍入为∞且符号无变化;这里emax和p由目的地格式决定(见3.3)“
所以在这个宣言中:
float a=3.4e39;
转换产生正无穷大。
答案 2 :(得分:3)
在IEEE浮点下,算术不可能溢出,因为可表示的范围是[-INF,INF]
(包括端点)。像往常一样,当精确值无法表示时,浮点会被舍入,在您的情况下,舍入产生INF
。
答案 3 :(得分:3)
其他答案看了浮点。这个答案是关于为什么有条件的整数值传统上环绕的原因。这不是因为这是特别好的行为。这是因为这是预期的,因为它是长期以来的方式。
特别是在早期硬件中,使用离散逻辑或非常有限的芯片空间,使用相同的加法器进行有符号和无符号整数加法和减法有一个主要优点。
浮点运算是在软件中完成的,除了特殊的“科学”计算机,这些计算机需要额外费用。浮点数始终是有符号的,并且正如其他答案中所指出的那样,它们有自己的格式。没有签名/未签名的硬件共享问题。
通过对有符号整数类型使用2's complement表示,可以实现有符号和无符号整数的通用硬件。
以下内容基于8位整数,每个位模式表示为2个十六进制数字。其他宽度的工作方式相同。
00到7f在无符号和2的补码中具有相同的含义,0到127的顺序是两个范围的交点。 80到ff按顺序表示128到255,对于无符号整数,但表示带符号的负数。为了使两者的加法相同,80表示-128,并且ff表示-1。
现在看看如果添加1到7f会发生什么。对于无符号,它必须从127增加到128.这意味着结果位模式为80,这也是最负的有符号值。共享加法器的价格在该范围内的一个点处是环绕的。