3

我想学习计算机如何double用bit表示类型,但是&|bit运算符不能用double. 而且memcpy(&d, &src, 8)似乎也不起作用。有什么建议么?

4

7 回答 7

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

于 2009-10-15T14:42:18.420 回答
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

或者您可以只阅读 IEEE 754 标准,它指定了表示。

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

于 2009-10-15T16:22:08.203 回答
1

一个特定的位布局本身是没有意义的。假设我有以下内容:1101

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

也许它是有符号的,并且那个高位表示该值为负数,这意味着它现在是-5。

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

你看,它不是存储,它是解释。阅读浮点值的表示和解释方式;它比查看这些位是如何打包的更能为您服务。

于 2009-10-15T14:46:06.850 回答
0

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

您的机器代表双打的方式很可能在此处详细说明。

于 2009-10-15T14:42:49.977 回答
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
于 2009-10-15T14:50:34.577 回答
0

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

  • 投掷:double a; long long b = *((long long *)&a);
  • 联盟:union { double a ; long long b };
于 2009-10-15T14:50:42.673 回答
0

Another option is to use bitfields. Armed with such a structure and knowledge of how a double is supposed to be stored on your computer you can very easily print out the different parts of the internal representation of the double. A bit like they do here.

于 2009-10-15T15:46:49.023 回答