gpt4 book ai didi

c - printf() 中大 float 的奇怪行为并分配给一个 int

转载 作者:太空宇宙 更新时间:2023-11-04 02:21:25 26 4
gpt4 key购买 nike

根据我的计算,将浮点值转换为计算机存储的二进制值(符号、指数、尾数格式),在 32 位中,1 位用于符号,8 位用于指数。

所以只剩下 23 位来表示数字。

所以我认为具有正确行为的浮点值范围仅为 0-0xffffff(基本上只有 3 个字节值),而不是 0-0xffffffff。这是正确的吗?

下面代码的奇怪行为是否与这个概念有关?

int main(void)
{
float a=2555555555;
printf("%f\n",a);
int b = a;
printf("%d",b);
return 0;
}

输出:

a = 2555555584.000000
b = -2147483648

最佳答案

关于您的程序,首先要注意的是值 2555555555超出了(带符号的)32 位整数类型的范围。从你程序的输出看来 int在您的系统上是 32 位类型,所以 2555555555不能是 int .

根据标准,2555555555然后将是 long intlong long int ,取决于是否long int足够大。

下一个相关部分是:

When a value of integer type is converted to a real floating type, if the value being converted can be represented exactly in the new type, it is unchanged. If the value being converted is in the range of values that can be represented but cannot be represented exactly, the result is either the nearest higher or nearest lower representable value, chosen in an implementation-defined manner. If the value being converted is outside the range of values that can be represented, the behavior is undefined.

(强调我的。)

因为 2555555555需要至少 32 位尾数才能准确表示,它不适合 32 位 float .这就是为什么 a最终包含 2555555584 ,类型最接近的可表示值 float .

对于 int b = a;本节适用于:

When a finite value of real floating type is converted to an integer type other than _Bool, the fractional part is discarded (i.e., the value is truncated toward zero). If the value of the integral part cannot be represented by the integer type, the behavior is undefined.

(强调我的。)

2555555584 ,所讨论的整数值,不能用带符号的 32 位 int 表示.您的这部分代码具有未定义的行为。

关于c - printf() 中大 float 的奇怪行为并分配给一个 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57453280/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com