c - Win10破解了printf函数

标签 c windows-10 printf

#include <stdio.h>
int main()
{
    float f = 1717.7890625;
    printf( "%.6f", f );
    return 0;
}
我使用 Visual Studio 19 (16.9.2) 为 x64 arch 编译了这段代码,并在我的两台 Windows 10 PC 上运行了结果:
  • 版本 1909(操作系统版本 18363.1440)-> 调试和发布:1717.789063
  • 版本 2004(操作系统版本 19041.867)-> 调试:1717.789063发布:1717.789062

  • 新版本Debug和Release结果不一样的原因是什么?如何修复它以使两个版本的结果相同?
    添加:
    编码:
    #include <stdio.h>
    int main()
    {
        double f = 0.25;
        printf( "%.1f", f );
        return 0;
    }
    
    在新的和旧的 Win10 版本上有相同的行为。我建议,这是较新的 ucrtbase.dll 版本中的错误

    最佳答案

    我发现了 Windows 版本和调试/ Release模式之间程序行为如此不同的原因。
    新的 Windows 更新(19041.* 如果我理解正确的话)更改了浮点类型小数部分的舍入规则:以前它在以 5 结尾的情况下舍入为更大:1.25 -> 1.3 ,但现在它四舍五入到最接近的偶数:1.25 -> 1.2 , 1.35 -> 1.4 .
    要了解新 Win 10 版本上调试和发布之间的区别,需要注意 ucrtbase.dll 使用和更新规则。

  • 每个应用程序的调试和发布版本都使用 ucrtbase.dll ucrtbased.dll 来自 C:\Windows\System32 或 C:\Windows\SysWOW64
  • 它的发布版本 ( ucrtbase.dll ) 是 Windows 10 的一部分,只能通过 Windows 更新进行更新。但它的调试版本 ( ucrtbased.dll ) 未随 Win 10 更新而更新,但可以通过安装较新的 Windows 10 SDK 进行更新(例如,在 Visual Studio 安装程序中)。

  • 因此,解决方案是在新的 Windows 10 版本上安装新的 Windows 10 SDK 以实现相同的行为或将 printf() 函数从 https://github.com/fmtlib/fmt 切换为 fmt::printf() 函数。 ,例如,使结果在所有 Windows 版本上都相同。

    关于c - Win10破解了printf函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66750222/

    相关文章:

    c - 黎曼和,C 梯形法则

    c - 如何使用 clang 的 -fsanitize=address 在调试输出中获取行号?

    c - 如何分配内存并将其返回(通过指针参数)给调用函数?

    c - 为什么下面的代码给出的输出与预期不同?

    c - 延迟之前的 printf 在 C 中不起作用

    c - 为什么int类型在BSS段占8字节,在DATA段占4字节

    c++ - Visual Studio Code 找不到 g++.exe (Windows 10)

    启动fork时出现Maven错误,请检查日志中的输出

    powershell - 找不到证书 : drive or Certificate Provider via Powershell

    java - Double 未存储正确的值