' E / e'十六进制与“E / e”区分开来在十六进制浮点文字中以指数形式?

时间:2016-07-16 15:23:55

标签: c

在C中,如果我想要一个浮点文字x是十六进制形式并且具有指数值,它将表示为:

float x = 0X2aE+10;

其中0x用于表示十六进制,而2a表示十六进制字符,而E + 10表示数字十进制为十进制。 但是,编译器是否知道它不是2aE表示十六进制数字(因为十六进制使用a到e表示10-15)而+10只是在数字上加10?如果它没有,那么修复是什么?

3 个答案:

答案 0 :(得分:16)

0X2aE+10是一个有效的预处理程序令牌,它不会转换为有效的C令牌,因此编译错误。 C99十六进制浮点数使用Pp作为指数标记,如:

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)

如果您看到例如this floating point literal reference您将看到十六进制浮点值需要pP中缀来表示指数。

所以定义应该是

float x = 0X2ap10;

答案 2 :(得分:5)

Hex浮点数使用p作为指数标记:

float x = 0x2ap+10;
然而,

实际上是double值。如果您需要float字面值,则需要f后缀:

float x = 0x2ap+10f;