3

doubleコンピューターが型をビットで表現する方法を知りたいのですが、ビット演算子&|ビット演算子は使用できません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 であることを意味します。

さらに、上位 2 ビットを底、下位 2 ビットを指数とすると、値 3 が得られます。

ほら、それはストレージではなく、解釈です。浮動小数点値がどのように表現および解釈されるかを読んでください。ビットがどのようにパックされているかを見るよりもはるかに役に立ちます。

于 2009-10-15T14:46:06.850 に答える
0

別のオプションは、bitfieldsを使用することです。このような構造と double がコンピューターに格納される方法に関する知識があれば、double の内部表現のさまざまな部分を非常に簡単に印刷できます。彼らがここでやっているのと少し似ています

于 2009-10-15T15:46:49.023 に答える
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

典型的なIEEE FP表現についても少し知っていない限り、それはあまり啓発的ではありません.

ほとんどの場合、あなたのマシンが double を表現する方法は、ここで詳しく説明されています。

于 2009-10-15T14:42:49.977 に答える