我现在正在学习 C,并且有一个转换说明符 %a 以 p 表示法写入一个数字,而不是 %e 以 e 表示法(指数表示法)写入一些东西。
什么是 p 表示法?
我现在正在学习 C,并且有一个转换说明符 %a 以 p 表示法写入一个数字,而不是 %e 以 e 表示法(指数表示法)写入一些东西。
什么是 p 表示法?
You use %a
to get a hexadecimal representation of a floating-point number. This might be useful if you are a student learning floating-point representations, or if you want to be able to read and write an exact floating-point number with no rounding error (but not very human-readable).
This format specificier, along with many others, was added as part of the C99 standard. Dinkumware have an excellent C99 library reference free online; it's PJ Plauger's company, and he had a lot to do with both C89 and C99 standard libraries. Link above is to printing functions; the general library reference is http://www.dinkumware.com/manuals/default.aspx
这是 c99 标准第 7.19.6.1 (7) 节的摘录,其中显示了 %a 或 %A 的详细信息(类似于上面 dmckee 给出的 mac 详细信息):
表示浮点数的双精度参数转换为 [−]0xh.hhhhp±d 样式,其中在小数点字符及其后的十六进制位数等于精度;如果缺少精度并且 FLT_RADIX 是 2 的幂,则精度足以精确表示该值;如果缺少精度并且 FLT_RADIX 不是 2 的幂,则精度足以区分 double 类型的值,但可以省略尾随零;如果精度为零且未指定 # 标志,则不出现小数点字符。字母 abcdef 用于转换,字母 ABCDEF 用于 A 转换。A 转换说明符生成一个带有 X 和 P 而不是 x 和 p 的数字。指数始终包含至少一个数字,并且仅包含表示 2 的十进制指数所需的更多数字。如果值为零,则指数为零。
从printf(3)
我的 Mac OS X 机器上的手册页(因此是 BSD c 标准库实现):
aA
double 参数被四舍五入并转换为样式 [-]0xh.hhhp[+-]d 的十六进制表示法,其中十六进制点字符后的位数等于精度规范。如果缺少精度,则认为它足以准确表示浮点数,并且不会发生舍入。如果精度为零,则不出现十六进制点字符。p 是一个文字字符p', and the exponent consists of a positive or negative sign followed by a decimal number representing an exponent of 2. The A conversion uses the prefix ``0X'' (rather than ``0x''), the letters ``ABCDEF'' (rather than ``abcdef'') to represent the hex digits, and the letter
P'(而不是 `p'),用于分隔尾数和指数。
“p”(或“P”)用于将(十六进制)尾数与(十六进制)指数分开。
这些说明符不在我的 K&R 中,并且手册页没有具体说明什么标准(如果有)指定它们。
我刚刚检查了我的 Debian 5.0 盒子(使用 glibc 2.7),它也有它;该手册页说它与 c99 相关(同样,没有参考任何特定标准)。
这可能有用:http ://www.cppreference.com/wiki/c/io/printf
具体来说,这里是您可以在 printf 中使用的格式说明符(没有 .02 等修饰符):
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