【问题标题】:How is the 'E/e' in hexadecimal differentiated from the 'E/e' in exponential form in a hexadecimal floating point literal?十六进制的“E/e”如何与十六进制浮点文字中的指数形式的“E/e”区分开来?
【发布时间】:2016-07-16 15:23:54
【问题描述】:

在 C 语言中,如果我希望浮点字面量 x 为十六进制形式并具有指数值,则将其表示为:

float x = 0X2aE+10;

其中 0x 用于表示它是十六进制,2a 表示十六进制字符,E+10 表示十的十次方。 但是,编译器会知道不是 2aE 代表十六进制数字(因为十六进制使用 a 到 e 表示 10-15)并且 +10 只是在数字上加十?如果没有,解决办法是什么?

【问题讨论】:

  • 0X2aE+10unsigned 计算,在将值 686(十进制)分配给 float 之前进行评估。
  • codepad.org/DaR86CWu 给我一个错误
  • clanggcc 都返回 error: invalid suffix '+10' on integer constant
  • @WeatherVane: 恐怕你弄错了:0X2aE+10 是一个有效的预处理器令牌,它不能转换成一个有效的 C 令牌,它不应该被解析为一个表达式。
  • @WeatherVane:有趣!与 MSVC 标准的又一区别。无论它是否支持十六进制浮点数,它都应该将0X2aE+10 解析为预处理数字(pp-number),该数字在阶段 7 中被转换为整数常量或浮点常量。不应像您的测试表明的那样重新解释或解析它。

标签: c


【解决方案1】:

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+E-p+p-P+P-

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

语义

预处理数字没有类型或值;它在成功转换(作为转换阶段 7 的一部分)到浮点常量令牌或整数常量令牌后获取两者。

【讨论】:

    【解决方案2】:

    十六进制浮点数使用p 作为指数标记:

    float x = 0x2ap+10;
    

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

    float x = 0x2ap+10f;
    

    【讨论】:

      【解决方案3】:

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

      所以定义应该是这样的

      float x = 0X2ap10;
      

      【讨论】:

      • 哦,好的,不知道 p。是否有理由将其转换为一开始的双精度而不是浮点数?
      • @Aryanpoonacha 我错了,我只写了double,因为它是默认的浮点类型,它当然是float
      • 另外,顺便提一下,不应该是 0x2ap+10 吗?还是0x2ap10默认为0x2ap+10?
      • @Aryanpoonacha 如果你把数字十写在纸上,你会写成“+10”吗? :) 所有数字都隐含加号,除非前面有减号。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-08
      • 1970-01-01
      • 1970-01-01
      • 2019-07-17
      • 2011-12-05
      • 1970-01-01
      相关资源
      最近更新 更多