C 为什么十六进制浮点需要指定指数?

C 为什么十六进制浮点需要指定指数?,c,standards,C,Standards,我现在正在学习编程语言(BNF、扫描器等),C中的十六进制浮点常量需要指数,这似乎很奇怪 根据C99标准 §6.4.4.2浮动常数 hexadecimal-floating-constant: hexadecimal-prefix hexadecimal-fractional-constant binary-exponent-part floating-suffix[opt] hexadecimal-prefix hexadecimal-digit-s

我现在正在学习编程语言(BNF、扫描器等),C中的十六进制浮点常量需要指数,这似乎很奇怪

根据C99标准

§6.4.4.2浮动常数

hexadecimal-floating-constant:  
    hexadecimal-prefix hexadecimal-fractional-constant  
        binary-exponent-part floating-suffix[opt]  
    hexadecimal-prefix hexadecimal-digit-sequence  
        binary-exponent-part floating-suffix[opt]
编写一个扫描程序来解析带有可选指数的十六进制浮点常量似乎很容易。为什么C标准规定十进制浮点数的指数是可选的,而十六进制浮点数的指数是必需的?

这在第6.4.4.2节:

C99的一个新特性是:C99添加了十六进制表示法,因为它比 清楚地表达了浮动常数的意义。这个 二进制指数部分是必需的,而不是可选的 十进制表示法,以避免因使用
f
后缀而产生歧义 误认为是十六进制数字

例如,
1.0f
是类型为
float
的十进制浮点常量,但
0x1.0f
将不明确,必须写入
0x1.0p0f

出于同样的原因,指数由
p
而不是
e
引入,因为
e
是一个有效的十六进制数字