什么是C编程中的p符号?

什么是C编程中的p符号?,c,programming-languages,variables,C,Programming Languages,Variables,我现在正在学习C,有一个转换说明符%a,它用p表示法写一个数字,而%e用e表示法(指数表示法)写一些东西 什么是p符号 没有%a格式说明符(据我所知,在任何常见的实现中肯定没有) 有一个%p格式说明符,用于打印指针地址 更新:请参阅其他帖子。从我的Mac OS X盒上的printf(3)手册页(因此BSD c标准库实现): aA 双参数四舍五入并转换为十六进制nota- 样式[-]0xh.hhhp[+-]d中的符号,其中的位数 十六进制后的字符等于精度 规范。如果缺少精度,则将其视为 足够精确

我现在正在学习C,有一个转换说明符%a,它用p表示法写一个数字,而%e用e表示法(指数表示法)写一些东西


什么是p符号

没有
%a
格式说明符(据我所知,在任何常见的实现中肯定没有)

有一个
%p
格式说明符,用于打印指针地址

更新:请参阅其他帖子。

从我的Mac OS X盒上的
printf(3)
手册页(因此BSD c标准库实现):

aA
双参数四舍五入并转换为十六进制nota- 样式[-]0xh.hhhp[+-]d中的符号,其中的位数 十六进制后的字符等于精度 规范。如果缺少精度,则将其视为 足够精确地表示浮点数,并且 舍入发生。如果精度为零,则没有十六进制点 字符出现。p是一个文本字符
p',而
指数由一个正号或负号后跟一个
表示2的指数的十进制数。这是一种转换
使用前缀“0X”(而不是“0X”),字母
``ABCDEF“”(而不是“ABCDEF”)表示十六进制数字,
和字母
P'(而不是'P')来分隔尾数和尾数 指数

“p”(或“p”)用于将(十六进制)尾数与(十六进制)指数分开

这些说明符不在我的K&R中,手册页也没有具体说明指定它们的标准(如果有)

我刚刚检查了我的Debian5.0框(使用Glibc2.7),它也有它;该手册页说它与c99相关(同样,没有提及任何特定标准)

这可能有用:

具体来说,以下是可以在printf中使用的格式说明符(不带.02等修饰符):


以下是c99标准第7.19.6.1(7)节的摘录,其中显示了%a或%a的详细信息(类似于上面dmckee给出的mac详细信息):

表示一个参数的双重参数 浮点数在中转换 风格[−]0xh.hhp±d,其中 是一个十六进制数字(即 如果参数为 规范化浮点数和 ,否则未指定) 小数点字符和 后面的十六进制数字数 等于精度;如果 缺少精度,FLT_基数为 如果幂为2,则精度为 足以精确表示 如果精度为 缺失和FLT_基数不是幂 如果为2,则精度足够 要识别类型的值,请执行以下操作: 双精度,但尾随的零可能 省略;如果精度为零 并且没有指定#标志,没有 将显示小数点字符 字母abcdef用于表示 转换和字母ABCDEF表示 转换,转换 说明符生成一个带有X和 P代替x和P。指数 始终包含至少一个数字, 而且数字的数量只有 表示小数点所必需的 2的指数。如果值为零, 指数为零


您可以使用
%a
获取浮点数的十六进制表示法。如果您是学习浮点数表示法的学生,或者您希望能够在不存在舍入错误的情况下(但不是很容易让人读懂)读取和写入精确的浮点数,这可能会很有用


这种格式更具体,与其他许多格式一样,是作为C99标准的一部分添加的。Dinkumware有一个免费的在线版本;它是PJ Plauger的公司,他与C89和C99标准库都有很多关系。上面的链接是打印功能;通用库参考是

向我们展示一些代码。这真的是printf吗?我不知道p-notation,并且没有%a说明符。您在哪里读这个,输出是什么样子的?下面是一些代码:float x=1.2*4.78;printf(“%a”,x);这里是输出:0x1.6f1aap+2@BlueRaja我正在读Stephen Prata的C Primer。我感谢你的帮助和兴趣。相信MAc是不同的!;)@Mitch:你说的对。直到OP问起我才听说。无论如何,在任何可能成为生产代码的东西中,都应该避免这种情况是非常罕见的……这是present在一些Linux printf中。我认为这是C99的东西。请看这里:将不得不修改我的“不要使用”建议,以“在使用它之前等待一段时间。您不希望您的代码很难移植,因为目标编译器的libc不符合最新规范。”这肯定是C99。IBM的此链接似乎证实:
Code    Format
%c  character
%d  signed integers
%i  signed integers
%I64d   long long (8B integer), MS-specific
%I64u   unsigned long long (8B integer), MS-specific
%e  scientific notation, with a lowercase “e”
%E  scientific notation, with a uppercase “E”
%f  floating point
%g  use %e or %f, whichever is shorter
%G  use %E or %f, whichever is shorter
%o  octal
%s  a string of characters
%u  unsigned integer
%x  unsigned hexadecimal, with lowercase letters
%X  unsigned hexadecimal, with uppercase letters
%p  a pointer
%n  the argument shall be a pointer to an integer into which is placed the number of characters written so far