printf 函数如何处理 %f 规范?

2023-12-24

我有几个程序的输出我无法理解:

方案1

#include <stdio.h>
int main(void)
{
  int i=1;
  float k=2;
  printf("k is %f \n",k);
  printf("i is %f \n",i);
  return 0;
}

输出位于http://codepad.org/ZoYsP6dc http://codepad.org/ZoYsP6dc

k is 2.000000 
i is 2.000000

方案2

现在再举一个例子

#include <stdio.h>

int main(void)
{
  char i='a';
  int a=5;
  printf("i is %d \n",i);  // here %d type cast char value in int
  printf("a is %f \n",a);  // hete %f dont typecast float value
  printf("a is %f \n",(float)a);  // if we write (float) with %f then it works
  return 0;
}

这里的输出位于http://codepad.org/XkZVRg64 http://codepad.org/XkZVRg64

i is 97 
a is 2.168831 
a is 5.000000 

Question

这里发生了什么?为什么我会看到显示的输出?


您可能正在 64 位 x86 架构上运行此应用程序。在此架构上,浮点参数在 XMM 寄存器中传递,而整数参数在通用寄存器中传递。看系统 V AMD64 ABI 约定 http://en.wikipedia.org/wiki/X86_calling_conventions#System_V_AMD64_ABI_convention.

Because %f需要一个浮点值:

printf("i is %f \n",i);

打印 XMM0 寄存器中的值,该值恰好是k较早分配且未分配i传入 RSI 寄存器。组装看起来像这样:

movl    $.LC1, %edi       # "k is %f \n"
movsd   .LC0(%rip), %xmm0 # float k = 2
call    printf
movl    $1, %esi          # int i = 1
movl    $.LC2, %edi       # "i is %f \n"
call    printf            # prints xmm0 because of %f, not esi

如果您像这样重新排序作业:

int i = 1;
printf("i is %f \n",i);

float k = 2;
printf("k is %f \n",k);

它打印:

i is 0.000000 
k is 2.000000 

因为XMM0寄存器的值恰好为0。

[Update]它也可以在 32 位 x86 上重现。在这个平台上printf()基本上是铸造int* to double*然后读到double。让我们修改一下示例以便于查看:

int main() {
    float k = 2;
    int i = -1;
    printf("k is %f \n",k);
    printf("i is %f \n",i,i);
}

64位输出:

k is 2.000000 
i is 2.000000 

32位输出:

k is 2.000000 
i is -nan 

也就是说,2int值为 -1 的 s 看起来像double0xffffffffffffffff 这是一个NaN value.

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

printf 函数如何处理 %f 规范? 的相关文章

  • 如何在运行 ASP.NET 页面时以编程方式设置表格背景?

    我有一个 aspx 页面 其默认背景颜色是一种 当选择单选按钮的某个选项时 我需要能够以编程方式更改它 我尝试设置表的 ID 字段 但似乎无法在 C 代码隐藏文件中访问它 我原来的表是 table style width 100 backg
  • Web API 复杂参数属性均为 null

    我有一个 Web API 服务调用可以更新用户的首选项 不幸的是 当我从 jQuery ajax 调用中调用此 POST 方法时 请求参数对象的属性始终为 null 或默认值 而不是传入的值 如果我使用 REST 客户端调用相同的方法 我使
  • 查找周边上的点来表示边界/形状

    我有一个简单的二维网格 其格式为myGrid x y 我正在尝试找到一种方法来找到所选网格周围的周长 这样我就有了所选网格的形状 这是我的意思的一个例子 这里的想法是找到所有相关的 角点 也就是图像周边的红点 放入一个列表中 这样我就可以从
  • C# 委托实例化与仅传递方法引用 [重复]

    这个问题在这里已经有答案了 我有一个简单的问题 与仅传递函数引用相比 实例化 C 委托有什么优势 我的意思是 Why do Thread t new Thread new ThreadStart SomeObject SomeMethod
  • 如何使用 Regsvr32 注册 .NET COM DLL?

    我有一个使用 COM DLL 的 VB6 应用程序 该DLL是用C 编写的 在 C 项目属性中 我检查了 Register for COM interop 选项 VB6 应用程序在我的开发机器上运行良好 C 代码完全遵循以下格式 CodeP
  • 使用 boost::asio 是否有一种可移植的方法来查找空闲端口号

    我目前正在尝试找出一种方法来查找空闲端口号以建立连接 最好使用 boost asio 然后 该端口号将用于侦听 只有这样我才能打开套接字 大致来说 有没有办法做到 tcp resolver query query localhost por
  • C# 中 value 为匿名类型的字典

    是否可以在 C 中创建一个System Collections Generic Dictionary
  • 可以轻易移动,但不可轻易复制

    是否可以创建类类型 即 普通移动构造 但不是普通复制构造 但仍然可复制构造 普通复制构造 但不是普通移动构造 但仍然可移动构造 可以简单地复制分配 但不能简单地移动分配 但仍然可以移动分配 可以简单地移动分配 但不能简单地复制分配 但仍然可
  • System.NotSupportedException:“集合是只读的。”从 iList 中删除对象时抛出

    运行下面的代码片段时抛出异常 我有一个 iListof webelements 如果该元素包含字符串 WSC 我想将其从 iList 中删除 谁能帮我吗 代码如下 IList
  • 使用 openssl 库获取 x509 证书哈希

    我目前正在开发一个应用程序 它使用 openssl 库 libcrypto 来生成证书 现在我必须获取现有证书的哈希值 当我使用终端时 我可以使用以下命令生成哈希值 openssl x509 hash in cert pem noout 输
  • 在浏览器中测试wcf服务

    我无法在浏览器中调用基本的 wcf web 方法 即使使用
  • 有没有办法对 RichTextBox 的撤消历史进行分组或暂时禁用它?

    我目前正在研究 WPF 中 RichTextBox 内的表格 在 WPF 中 表格没有行和列 只有行 每行都有一定数量的单元格 当用户按下 添加列 按钮时 我的程序会向每一行添加一个新单元格 使用此方法的问题是 在用户添加一列后 如果他们按
  • 创建 PING 程序时限制 ICMP 回显答复

    我正在编写一个多线程 ping 程序 我在每个线程 针对每个 IP 上创建了原始套接字 并使用 sendto 向每个线程发送了 ICMP Echo 请求 然后在每个线程中执行了 receivevfrom 我正在从各种套接字中的 IP 获取消
  • 等效

    这是否保证始终为真 std numeric limits
  • 在 4.x 内核上的 64 位内存中查找系统调用表

    我正在尝试编写一个简单的内核模块来查找 Linux 中的 sys call table 但遇到了一些麻烦 我在这里找到了 32 位 Linux 的基本指南 https memset wordpress com 2011 03 18 sysc
  • ASP.NET Core中间件如何进行DI?

    我正在尝试将依赖项注入到我的中间件构造函数中 如下所示 public class CreateCompanyMiddleware private readonly RequestDelegate next private readonly
  • 如何在 OpenCV 中删除 mouseCallback

    在使用 C 的 OpenCV 中 有没有办法删除 mouseHandler int event int x int y int flags void param 通过函数添加到窗口 image window cv setMouseCallb
  • 如何设置扬声器声音增强设置

    如何以编程方式设置 Windows 扬声器设置 增强 选项卡 中可用的声音效果 恐怕这是不可能的 参见 Maurits 对他的评论blog http blogs msdn com b matthew van eerde archive 20
  • C++ 从文件中读取字符串

    我试图将字符串直接存储到一个文件中 以便稍后在 C 中读取 基本上 对于整个范围 我试图将带有字符串变量的对象数组存储在文件中 并且这些字符串变量将通过类似 object 的内容读取 0 字符串 然而 每次我尝试读取字符串变量时 系统都会给
  • 文件按文件名模式存在

    我在用 File Exists filepath 我想做的是将其替换为模式 因为文件名的第一部分发生了变化 例如 该文件可以是 01 peach xml 02 peach xml 03 peach xml 如何根据某种搜索模式检查文件是否存

随机推荐

  • 找出将 n 表示为两个有边界整数之和的方法数

    我正在玩 codefight 但我真的被困住了 到下面的有效问题 Problem 给定整数 n l 和 r 找到将 n 表示为两个整数 A 和 B 之和的方法数 使得 l A B r Example 对于 n 6 l 2 且 r 4 输出应
  • 从AWS S3下载文件时的文件编码问题

    我在 AWS S3 中有一个 CSV 文件 我试图在本地临时文件中打开该文件 这是代码 s3 Aws S3 Resource new bucket s3 bucket bucket name obj bucket object object
  • Linux 中的安全 Python 环境

    是否可以创建一个在Linux下安全运行任意Python脚本的环境 这些脚本应该是从不受信任的人那里收到的 并且可能太大而无法手动检查 一个非常暴力的解决方案是创建一个虚拟机并在每次启动不受信任的脚本后恢复其初始状态 太贵了 我想知道是否可以
  • C# 字典 ValueOrNull / ValueorDefault

    目前我正在使用 var x dict ContainsKey key dict key defaultValue 我想要某种方法让字典 key 对于不存在的键返回null 所以我可以写类似的东西 var x dict key default
  • QMessageBox.Yes/QMessageBox.No 的值

    我学习 PyQt5 对我来说看起来很复杂 我想知道为什么QMessageBox Yes 或没有 有一些特殊的价值 对我来说是16384 这就是我的意思 from PyQt5 import QApplication QWidget QMess
  • XNA BlendState 与 SpriteBatch

    我们需要一个 BlendState 来充当以下角色 透明 PNG 按预期绘制 保留其后面的任何内容 We use Color White按原样绘制 PNG 我们将改变颜色的 Alpha 通道来改变纹理的 不透明度 为了达到这个效果 Blen
  • 如何正确捕获 WinForms 应用程序中所有未处理的异常

    我想为 WinForms 应用程序中任何线程的所有未处理异常设置处理程序方法 我自己不创建任何应用程序域 根据未处理的异常 https msdn microsoft com en us library system appdomain un
  • Kendo-UI 和 Angularjs 多选选项消失

    我正在使用 Angularjs 和 Kendo UI 当我使用 Kendo ui 多重选择并且我在同一视图上有其他元素时 当我在 我在下面的链接中添加了一个简单的 plunker 演示 要使用它 只需先从多选状态列表中选择一个或多个状态 然
  • 在哪里可以找到用于访问 Exchange/Outlook 联系人和约会的示例 Delphi 代码或组件?

    我需要 Delphi 代码或组件来访问 Exchange Outlook 联系人和约会 我可能需要使用扩展 MAPI 这是为了概念验证 所以我现在还没有准备好花大钱 有什么提示 链接 经验吗 看看这个 在 MS Outlook 中创建约会
  • 如何将具有相同列值的行分组?

    给定具有 3D 空间中的坐标的矩阵和两个矩阵中两个变量 例如 a 和 b 的值 我想将相同点的行合并到一个公共矩阵中 为了清楚地解释这个问题 假设我们有矩阵 A posX posY posZ a and B posX posY posZ b
  • 在 Mahout 0.8 中运行 cvb

    当前的 Mahout 0 8 SNAPSHOT 包括用于主题建模的折叠变分贝叶斯 cvb 版本 并删除了潜在狄利克雷分析 lda 方法 因为 cvb 可以更好地并行化 不幸的是 只有文档lda https cwiki apache org
  • SignalR 请求管道、集线器生命周期

    我从使用 asp net webapi 的 signalR 开始 我试图了解整个 signalR 请求 连接管道以及集线器的生命周期是什么以及谁创建和处置集线器实例 它是否在客户端之间的每次通信上创建 和服务器 原因之一是我们需要了解应该如
  • 文件上传在 jQuery UI 对话框中不起作用

    所以我有一个相当奇怪的问题 我想看看是否有人有一些见解 我有一个页面 其中显示已上传到我们服务器的文件网格 网格工具栏使他们能够上传更多文件 当他们单击工具栏上的 添加文件 按钮时 会出现一个 jQuery UI 对话框模式窗口 其中包含一
  • 在C++中,如何将一个字符串拆分为多个整数? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我有一个由
  • Makefile:英特尔 fortran、文件夹中的源文件和英特尔数学核心函数库

    我在文件夹 ex 中有一个 main f90 f77 子程序文件位于 ex src 中 子程序文件再次使用 BLAS 和 LAPACK 库 对于 BLAS 和 LAPACK 我必须使用 Intel Math Kernel Library I
  • 获取 Facebook 页面选项卡上的用户位置

    可口可乐似乎在这方面做得很好 即使在任何用户交互之前 他们也会设法知道您所在的位置 这适用于 IE 因此不涉及 HTML5 毕竟 Facebook 不会识别navigatorJavaScript 中的对象 他们如何做到这一点 首先 我不认为
  • Sonarqube 未注册任何 C# 问题

    大概类似于这个问题 https stackoverflow com questions 36401757 sonarqube is not registering any c sharp issues 但由于之前的版本已经回答了这个问题 所
  • 匹配多个正则表达式组并删除它们

    我收到了一个文件 我想从中提取有用的数据 文件的格式如下 LINE 1 TOKENKIND somedata TOKENKIND somedata LINE 2 TOKENKIND somedata LINE 3 etc 我想做的是删除 L
  • Tkinter 框架调整大小

    我已经被困了几天 试图弄清楚如何使用这种方法动态调整 TKInter 中的框架大小 class SampleApp tk Tk def init self args kwargs tk Tk init self args kwargs th
  • printf 函数如何处理 %f 规范?

    我有几个程序的输出我无法理解 方案1 include