C中的十六进制浮点常数

时间:2011-03-29 23:50:25

标签: c floating-point hex

我有一个十六进制浮点常量,我想在我的C程序中直接声明,并避免转换。我相信它必须首先正常化,对吗?我如何规范化并声明它?

// hex constant 0xDE.488631  
double val = 0xDE.488631; // Error must have exponent.
double val = 0x0.DE488631p-2;  // Pretty sure this is wrong.

2 个答案:

答案 0 :(得分:17)

您可以使用0的指数:

float val = 0xDE.488641p0;

其中更正常的符号表示DE.488641×2 0 (当然,在16中)。你的猜测很接近 - 指数是二进制指数,而不是十六进制指数。当你想要一个正指数时,你也使用负指数。更正您的第二个示例,您可以使用:

float val = 0x0.DE488631p8;

在常规数学符号中表示0.DE488631×2 8 ,或等效于指数的十六进制基数,0.DE488631×16 2

我认为使用0的指数更容易理解,除非您有理由使用第二个示例中的表单。

答案 1 :(得分:1)

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]

根据此定义,您可以看到只有浮动后缀是可选的(即fl可以附加到浮动常量以强制特定浮动类型)。正如Carl Norum已经建议的那样,使用0的指数作为“无操作”。