十六进制中的'E/e'如何与十六进制浮点字面值中的指数形式的'E/e'区分开来?

Ary*_*cha 14 c

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

float x = 0X2aE+10;
Run Code Online (Sandbox Code Playgroud)

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

chq*_*lie 16

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

float x = 0X2aP+10;
Run Code Online (Sandbox Code Playgroud)

哪个有价值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 .
Run Code Online (Sandbox Code Playgroud)

描述

甲预处理号码以任选地被一个句点(.)前面的一个数字,并且可以随后有效的标识符的字符和字符序列e+,e-,E+,E-,p+,p-,P+,或P-.

词法上预处理数字标记包括所有浮点和整数常量标记.

语义

预处理号码没有类型或值; 它在成功转换(作为转换阶段7的一部分)之后获取浮动常量令牌或整数常量令牌.


Som*_*ude 5

如果您看到例如此浮点文字引用,您将看到十六进制浮点值需要p或中P缀来表示指数.

所以定义应该是这样的

float x = 0X2ap10;
Run Code Online (Sandbox Code Playgroud)


mel*_*ene 5

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

float x = 0x2ap+10;
Run Code Online (Sandbox Code Playgroud)

不过,这实际上是一个double价值.如果你想要一个float文字,你需要一个f后缀:

float x = 0x2ap+10f;
Run Code Online (Sandbox Code Playgroud)