我想了解计算机如何代表double
类型的位,但&
和|
位运算符不能使用double
。并且memcpy(&d, &src, 8)
似乎也不起作用。有什么建议吗?
答案 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;
}
答案 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,它指定表示。
答案 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 { double a ; long long b };
答案 6 :(得分:0)