我想学习计算机如何double
用bit表示类型,但是&
和|
bit运算符不能用double
. 而且memcpy(&d, &src, 8)
似乎也不起作用。有什么建议么?
问问题
6915 次
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;
}
于 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 标准,它指定了表示。
于 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
关键是在不改变二进制表示的情况下将 转换double
为long 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 回答