如何在C99中获得带符号的浮点零?

时间:2016-04-29 03:01:56

标签: c floating-point c99

我们怎样才能在C99中获得带符号的浮点零点?实际上,我想查看它的位模式。

3 个答案:

答案 0 :(得分:4)

通过签名的浮点零,我认为你的意思是负零。如果是,您可以使用-0.0

示例:

#include <stdio.h>
#include <string.h>

void test(double val)
{
   unsigned char array[sizeof(double)];

   memcpy(array, &val, sizeof(double));
   for (int i = 0; i < sizeof(double); ++i )
   {
      printf("%02hhx", array[i]);
   }
   printf("\n");
}

int main()
{
   double v1 = -0.0;
   double v2 = 0.0;

   test(v1);
   test(v2);
};

我的设置输出(64位Linux / gcc 4.8.4):

0000000000000080
0000000000000000

C标准并未强制要求支持负零。我只能找到像“ On代表零签零的实现”这样的短语。

如果编译器对浮点数使用IEEE 754表示,则需要它们支持负零。来自https://en.wikipedia.org/wiki/Signed_zero#Representations

  

在IEEE 754二进制浮点数中,零值由偏置指数和有效数表示,均为零。负零的符号位设置为1。作为某些计算的结果,可能会获得负零,例如,作为负数的算术下溢的结果,或−1.0*0.0,或简称为−0.0

答案 1 :(得分:1)

你可以使用C语句:

float zero = 0.0f;

所有float都已签名,这是float号码格式的一部分

答案 2 :(得分:1)

int main(){

  float f = 0.0f;

  //observe as an array of bytes
  unsigned char *c = (unsigned char *)(&f);

  //for each byte in the float
  for (int i = 0; i < sizeof(float); ++i){

    //for each bit in the byte
    for (int j = 0; j < sizeof(char) * CHAR_BIT; ++j){

      //print 1 or 0 based on the bit value
      ((c[i] >> j) & 1) ? printf("1") : printf("0");

    }
  }
}

看看Float Toy 它是可视化IEEE浮点格式的有用工具。