double
コンピューターが型をビットで表現する方法を知りたいのですが、ビット演算子&
と|
ビット演算子は使用できませんdouble
。またmemcpy(&d, &src, 8)
、機能していないようです。助言がありますか?
7 に答える
ここ:
#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
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 標準について読むこともできます。
特定のビット レイアウト自体には意味がありません。次のものがあるとします。1101
これは符号なしで、値 13 を表していると言うかもしれません。
おそらくそれは署名されており、その上位ビットは値が負であることを示し、現在は -5 であることを意味します。
さらに、上位 2 ビットを底、下位 2 ビットを指数とすると、値 3 が得られます。
ほら、それはストレージではなく、解釈です。浮動小数点値がどのように表現および解釈されるかを読んでください。ビットがどのようにパックされているかを見るよりもはるかに役に立ちます。
これは私のために働く
#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
重要なのは、バイナリ表現を変更せずに を (と仮定して)double
にlong long
変換することです。sizeof(double) == sizeof(long long)
これは、次のいずれかの方法で実現できます。
- キャスト:
double a; long long b = *((long long *)&a);
- 連合:
union { double a ; long long b };
典型的なIEEE FP表現についても少し知っていない限り、それはあまり啓発的ではありません.
ほとんどの場合、あなたのマシンが double を表現する方法は、ここで詳しく説明されています。