如何逐位打印C双头以查看低级表示?

时间:2009-10-15 14:37:28

标签: c double bit

我想了解计算机如何代表double类型的位,但&|位运算符不能使用double。并且memcpy(&d, &src, 8)似乎也不起作用。有什么建议吗?

7 个答案:

答案 0 :(得分:6)

下面:

#include <stdio.h>
int main ()
{
    double decker = 1.0;
    unsigned char * desmond = (unsigned char *) & decker;
    int i;

    for (i = 0; i < sizeof (double); i++) {
         printf ("%02X ", desmond[i]);
    }
    printf ("\n");
    return 0;
}

您可以尝试:http://codepad.org/onHnAcnC

答案 1 :(得分:2)

union {
  double  d;
  unsigned char c[sizeof(double)];
} d;

int main(int ac, char **av) {
  int i;
  char s1[80], s2[80];

  d.d = 1.0;
  for(i = 0; i < sizeof d; ++i) {
    sprintf(s1 + i * 3, " %02x", d.c[i]);
    sprintf(s2 + i * 3, " %02x", d.c[sizeof d - 1 - i]);
  }
  printf("%s\n%s\n", s1, s2);
  return 0;
}

$ ./a.out
00 00 00 00 00 00 f0 3f
3f f0 00 00 00 00 00 00

或者你可以read about the IEEE 754 standard,它指定表示。

http://en.wikipedia.org/wiki/IEEE_754-1985

答案 2 :(得分:1)

特定的位布局本身毫无意义。假设我有以下内容:1101

也许我说这是无符号的,它代表值13。

也许它已签名,高位表示该值为负数,这意味着它现在为-5。

进一步考虑我认为高两位是基数而低两位是指数,然后我得到值3.

你看,它不是存储,它的解释。阅读如何表示和解释浮点值;它会比看到这些比特的打包方式更好地为你服务。

答案 3 :(得分:0)

除非您对典型的IEEE FP表示有所了解,否则这不会很有启发性。

很可能是您的机器代表双打的方式here

答案 4 :(得分:0)

这对我有用

#include <stdio.h>
#include <string.h> /* memmove */
int main(void) {
  unsigned char dontdothis[sizeof (double)];
  double x = 62.42;

  printf("%f\n", x);
  memmove(&dontdothis, &x, sizeof dontdothis);
  /* examine/change the array dontdothis */
  dontdothis[sizeof x - 1] ^= 0x80;
  /* examine/change the array dontdothis */
  memmove(&x, &dontdothis, sizeof dontdothis);
  printf("%f\n", x);
  return 0;
}

结果是

62.420000
-62.420000

答案 5 :(得分:0)

关键是将double转换为long long(假设sizeof(double) == sizeof(long long))而不更改二进制表示。这可以通过以下方法之一来实现:

  • 演员:double a; long long b = *((long long *)&a);
  • union:union { double a ; long long b };

答案 6 :(得分:0)

另一种选择是使用bitfields。有了这样一个结构,并且知道如何在你的计算机上存储双重文件,你可以很容易地打印出双重内部表示的不同部分。有点像here