gpt4 book ai didi

C:将最小 32 位整数 (-2147483648) 转换为 float 给出正数 (2147483648.0)

转载 作者:太空狗 更新时间:2023-10-29 16:35:20 25 4
gpt4 key购买 nike

当我遇到一些我认为很奇怪的行为时,我正在做一个嵌入式项目。我设法在键盘上重现它(见下文)以确认,但我的机器上没有任何其他 C 编译器可以在它们上尝试。

场景:我有一个 #define 用于 32 位整数可以容纳的最大负值,然后我尝试使用它来与浮点值进行比较,如下所示:

#define INT32_MIN (-2147483648L)

void main()
{
float myNumber = 0.0f;
if(myNumber > INT32_MIN)
{
printf("Everything is OK");
}
else
{
printf("The universe is broken!!");
}
}

键盘链接:http://codepad.org/cBneMZL5

在我看来这段代码应该可以正常工作,但令我惊讶的是它打印出 The universe is broken!!

此代码隐式地将 INT32_MIN 转换为 float,但结果是浮点值 2147483648.0(正数!),即使浮点类型完全能够表示 -2147483648.0

有没有人对这种行为的原因有任何见解?

代码解决方案:正如 Steve Jessop 在他的回答中提到的,limits.hstdint.h 包含正确的(有效的) int 范围 define 已经存在,所以我现在使用这些而不是我自己的 #define

问题/解决方案说明摘要:鉴于答案和讨论,我认为这是对正在发生的事情的一个很好的总结(注意:仍然阅读答案/评论,因为它们提供了更详细的解释) :

  • 我使用的是带有 32 位 long 的 C89 编译器,因此任何大于 LONG_MAX 且小于或等于 ULONG_MAX 的值L 后缀的类型为 unsigned long
  • (-2147483648L) 实际上是 unsigned long 上的一元 -(参见上一点)值:-(2147483648L )。此取反运算将值“包装”为 2147483648unsigned long 值(因为 32 位 unsigned long 的范围为 0 - 4294967295)。
  • 这个 unsigned long 数字看起来当它被打印为 int 或传递给一个函数,因为它首先被转换为 int,它将这个超出范围的 2147483648 包装到 -2147483648 (因为 32 位 int 的范围是 -2147483648 到 2147483647)
  • 但是,转换为 float 是使用实际的 unsigned long2147483648 进行转换,从而得到浮点值2147483648.0

最佳答案

替换

#define INT32_MIN (-2147483648L)

#define INT32_MIN (-2147483647 - 1)

-2147483648 被编译器解释为 2147483648 的否定,这会导致 int 溢出。所以你应该写成(-2147483647 - 1)
不过,这都是 C89 标准。请参阅 Steve Jessop 对 C99 的回答。
此外,long 在 32 位机器上通常为 32 位,在 64 位机器上通常为 64 位。 int 在这里完成任务。

关于C:将最小 32 位整数 (-2147483648) 转换为 float 给出正数 (2147483648.0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11536389/

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