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

2024-03-18

我正在开发一个嵌入式项目,当时我遇到了一些我认为很奇怪的行为。我设法在键盘上重现它(见下文)以进行确认,但我的机器上没有任何其他 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 http://codepad.org/cBneMZL5

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

此代码隐式转换INT32_MIN to a float,但事实证明这会导致浮点值2147483648.0(积极!),即使浮点类型完全能够表示-2147483648.0.

有谁对这种行为的原因有任何见解吗?

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

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

  • 我使用的是 32 位 C89 编译器longs,因此任何大于的值LONG_MAX且小于或等于ULONG_MAX接下来是Lpostfix 有一种类型unsigned long
  • (-2147483648L)实际上是一元- on an unsigned long(见上一点)值:-(2147483648L)。此否定操作将值“包裹”为unsigned long的价值2147483648(因为 32 位unsigned longs 有范围0 - 4294967295).
  • This unsigned long number looks就像预期的负面结果一样int当它被打印为一个值时int或传递给一个函数,因为它首先被转换为int,这超出了范围2147483648大约到-2147483648(因为 32 位ints 的范围为 -2147483648 到 2147483647)
  • 演员阵容float然而,正在使用实际的unsigned long value 2147483648进行转换,得到浮点值2147483648.0.

Replace

#define INT32_MIN (-2147483648L)

with

#define INT32_MIN (-2147483647 - 1)

-2147483648被编译器解释为否定2147483648,这会导致溢出int。所以你应该写(-2147483647 - 1)反而。
这就是全部C89标准虽然。请参阅 Steve Jessop 的回答C99.
Also long在 32 位计算机上通常为 32 位,在 64 位计算机上通常为 64 位。int事情就在这里完成。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C:将最小 32 位整数 (-2147483648) 转换为浮点数给出正数 (2147483648.0) 的相关文章

  • 哪个运算符更快:!= 或 >

    哪个运算符更快 gt or 示例 我想针对 1 测试一个值 可以为正值或 1 if time gt 1 or if time 1 时间的类型为 int 标准没说 因此 这取决于给定编译器在给定版本中生成哪些操作码 以及给定 CPU 执行它们
  • 如何在代码中设置控件模板?

    我在 XAML 中有这个
  • 如何在命名管道 (mkfifo) 上执行非阻塞 fopen?

    如果我有一个程序使用 mkfifo 创建并尝试打开命名管道 如何在不阻塞的情况下打开管道进行读取或写入 具体来说 我正在编写一个 C 程序 它可以在有或没有 GUI 的情况下运行 用 Java 编写 在 C 程序中 我使用 mkfifo 成
  • QT 5.6 QWebEngine不保存cookie

    我正在创建名为 webengine 的简单 QT 应用程序 pWebView new QWebEngineView this pWebView gt load QUrl http technoz ru pWebView gt show On
  • 如何在 CUDA 中执行多个矩阵乘法?

    我有一个方阵数组int M 10 以便M i 定位第一个元素i th 矩阵 我想将所有矩阵相乘M i 通过另一个矩阵N 这样我就收到了方阵数组int P 10 作为输出 我看到有不同的可能性 分配不同元素的计算M i 到不同的线程 例如 我
  • Polly 策略记录异常并重新抛出

    我考虑使用Polly https github com App vNext Polly handing return values and policytresult创建策略来记录异常并重新抛出 我没有找到允许它开箱即用的现有方法 但我看到
  • 从 C# 运行 32 位或 64 位 PowerShell

    我构建了一个执行 PowerShell 脚本的 32 位 NET DLL 我需要它能够以 64 位模式运行脚本and 32 bit 我已经知道如何使用命令行执行此操作 C Windows Sysnative cmd c powershell
  • 如何使用 C# 获取打印作业状态

    我可以打印文档 但不知道如何获取其状态 我查阅了很多资源 MSDN http support microsoft com kb 322091 检查工作状态的链接 https stackoverflow com questions 55637
  • 从该共享库中查找加载的共享库的位置?

    从共享库中的函数 在正在运行的进程 用 C 编写 内 我如何发现该共享库是从哪里加载的 我找到的所有答案都涉及使用诸如ldd在命令行中 或者通过查看 proc self maps 在 Win32 上 我只需使用GetModuleFileNa
  • 抑制第 3 方库控制台输出?

    我需要调用一个第三方库 该库恰好会向控制台输出一堆内容 代码就像这样 int MyMethod int a int b ThirdPartyLibrary Transform a spews unwanted console output
  • 如何在 Visual C++ 中创建 ActiveX DLL

    是否有在 Visual Studio 2008 C 中创建 ActiveX DLL 的教程 参考 我有一个使用 DLLRegisterServer UnregisterServer 构建的 DLL 并且已注册 但我在弄清楚使用什么名称来引用
  • const QList 警告 = QList() << 0; gcc 4.7.2 的段错误

    因此 主题行中提到的代码会导致 Qt 4 8 3 和 gcc 4 7 2 出现分段错误 这是在 cpp 文件中的任何类 结构之外 并且与 gcc 4 4 一起使用 const QList
  • C#:模拟内存泄漏

    我想用c 编写以下代码 a 模拟内存泄漏的小型控制台应用程序 b 小型控制台应用程序 它将调用上述应用程序并立即释放它 模拟管理内存泄漏问题 换句话说 应用程序 b 将不断调用并释放应用程序 a 以模拟如何遏制 叛逆 内存泄漏应用程序 而不
  • 使用 istream_iterator 范围构造时无法访问向量

    我尝试编译此代码片段 但出现编译器错误 使用 Visual Studio 2010 进行编译 include
  • 从 std::list 中删除具有特定值的元素

    我需要从 std list 中删除具有特定值的元素 随着list
  • C 结构体中的 Typedef

    首先是令我困惑的代码 typedef struct Object typedef int MyInt void destructor Object void constructor struct Object Object 为什么编译器阻止
  • 静态、非成员或静态非成员函数?

    每当我有一些 实用 方向的功能时 我最终都会想知道哪个选项是最好的 例如 在我正在工作的上下文中打印消息结构 自己的或外部的 一些编码 解码代码或一些有用的转换函数 我想到的选项是 1 辅助类 结构中的静态函数 struct helper
  • 以编程方式更改 Windows 服务用户

    我需要以编程方式更改 Windows 服务的登录用户 我使用以下代码来做到这一点 string objPath string Format Win32 Service Name 0 ServiceName using ManagementO
  • WCF maxBytesPerRead 限制为 4096

    我在流模式下使用基本的 WCF Web 服务从服务器下载文件 我已将服务器端的绑定指定为
  • 无法使用 openxml 在 PPT 报告中生成第二个表

    我有这个代码 我能够完美地生成带有文本数据的 pptx 报告 我在这份报告中还有 4 个表格 其中包含动态数据 我可以在 PPT 中生成一张表格 但无法生成多个表格 Requirement On the right I have 4 tab

随机推荐