在C中,如果我想要一个浮点文字x是十六进制形式并且具有指数值,它将表示为:
float x = 0X2aE+10;
其中0x用于表示十六进制,而2a表示十六进制字符,而E + 10表示数字十进制为十进制。 但是,编译器是否知道它不是2aE表示十六进制数字(因为十六进制使用a到e表示10-15)而+10只是在数字上加10?如果它没有,那么修复是什么?
答案 0 :(得分:16)
0X2aE+10
是一个有效的预处理程序令牌,它不会转换为有效的C令牌,因此编译错误。 C99十六进制浮点数使用P
或p
作为指数标记,如:
float x = 0X2aP+10;
其值为0x2a * 1024
- > 43008
。
对于那些不了解预处理数字的人:
6.4.8预处理数
<强>语法强>
pp-number: digit . digit pp-number digit pp-number identifier-nondigit pp-number e sign pp-number E sign pp-number p sign pp-number P sign pp-number .
<强>描述强>
预处理编号以数字开头,可选地以句点(。)开头,后跟有效的标识符字符和字符序列
e+
,e-
,E+
,{{ 1}},E-
,p+
,p-
或P+
。预处理数字标记词法上包括所有浮动和整数常量标记。
<强>语义强>
预处理号码没有类型或值;它在成功转换(作为转换阶段7的一部分)之后获取浮动常量标记或整数常量标记。
答案 1 :(得分:5)
答案 2 :(得分:5)
Hex浮点数使用p
作为指数标记:
float x = 0x2ap+10;
然而,实际上是double
值。如果您需要float
字面值,则需要f
后缀:
float x = 0x2ap+10f;