user-0 提问: 求解一个算法问题。。

回复:
user: user-1
content: double x = 0; unsigned char * p =&x; //先这样试试 p[0]=1,p[1]=2,p[2]=3,p[3]=4; //再这样试试 p[4]=1,p[5]=2,p[6]=3,p[7]=4; //不然可以反序  //另外也可以这样 union ｛ double a; unsigned int b[2]; };   b[0] =0x04030201; b[1]=0; //或者反过来。  b[0] =0x01020304; b[1]=0; //不然 b[0]=0; b[1] =0x04030201; ///或者反过来。 b[0]=0; b[1] =0x01020304; //总之，不过是个字节顺序的问题。

user: user-2
content: 在计算机中，double型的数据编码和int型char型是不同的，double y=0x04030201，占8个字节，这个值的在内存中的表示为：00 00 00 04 08 0c 90 41（我的计算机得到的值是这个，不同的计算机可能不同）。而int y=0x04030201在内存中的表示为 01 02 03 04（这个结果表示我使用的计算机是小端型的），要想得到楼主想要的结果可参考二楼的程序，让后将结果int强制转换成double

user: user-3
content: 4楼正解，只不过打印时出现指数形式，需要改成16进制形式 unsigned char Y1[8];     Y1[0]=0x01;     Y1[1]=0x02;     Y1[2]=0x03;     Y1[3]=0x04;          double y = *(double *)Y1;     printf("%x", y);

user: user-0
content: 现在是要把double d=0x01020304;  怎么成为 unsigned char[4]={0x01,0x02,0x03,0x04} 得到的结果就是一个char数组。  不支持long long类型的。。如果用int或者long类型的时候，long  d=0x01020304;这样已经溢出了吧。。

user: user-4
content: 用long long类型，然后注意一下大小端问题

user: user-5
content: printf("y=0x%08x.\n", y); 打印这样更清楚些

user: user-5
content: int main(int argc, char* argv[]) {     unsigned char x[4] = {0x01, 0x02, 0x03, 0x04};      unsigned int y = (unsigned int)(*(int*)x);  	printf("y=%d.\n", y); 	return 0; }

user: user-6
content: http://bbs.csdn.net/topics/390676437

user: user-5
content: 为什么不用unsigned int呢

user: user-7

user: user-0
content: 再请问一下double d=0x01020304; 怎么转换的到 unsigned char[4]={0x01,0x02,0x03,0x04} 通过什么算法可以进行转换呢

user: user-6
content: double  y永远也不会等于0x04030201

user: user-8
content: 引用 2 楼 lslvxy 的回复:[quote=引用 1 楼 u013595256 的回复:] #include<stdio.h>  int main(void) {  	unsigned char Y1[4]; 	int y = 0;     int i;  	Y1[0]=0x01;     Y1[1]=0x02;     Y1[2]=0x03;     Y1[3]=0x04; 	 	for(i = 3; i>=0; i--) 		y = (y << 8) + Y1[i]; 	printf("y=%#x\n", y); 	return 0; }仅供参考，y用的int型  这样虽然可以，但是如果Y1中的数据比较大的话计算后会超出int的范围的吧。。所以我才想是用double类型来接收的。[/quote]我觉得你可以根据你的数据数量，malloc一块内存，然后用memcpy把相应的数据拷贝到那块内存区域中，我没写代码，你可以试试。

user: user-9
content: 已经是了。

user: user-10
content: #include <iostream> using namespace std;  int main() {     unsigned char Y1[4];     Y1[0]=0x01;     Y1[1]=0x02;     Y1[2]=0x03;     Y1[3]=0x04;          double d = *(double *)Y1; 	cout << d << endl; 	return 0; }

user: user-11
content: 如果使用double型，就没法使用左移，而且数据会丢失。如果数位相对较少，最大用到long long int，再长，就用数组直接输出。 #include<stdio.h>  int main(void){ 	unsigned char Y1[4]; 	int i;  	Y1[0] = 0x01; 	Y1[1] = 0x02; 	Y1[2] = 0x03; 	Y1[3] = 0x04;  	printf("y=0x"); 	for (i = 3; i >= 0; --i){ 		if (Y1[i] <= 0xF)putchar('0'); 		printf("%x", Y1[i]); 	} 	putchar('\n'); 	return 0; }

user: user-0
content: 引用 1 楼 u013595256 的回复:#include<stdio.h>  int main(void) {  	unsigned char Y1[4]; 	int y = 0;     int i;  	Y1[0]=0x01;     Y1[1]=0x02;     Y1[2]=0x03;     Y1[3]=0x04; 	 	for(i = 3; i>=0; i--) 		y = (y << 8) + Y1[i]; 	printf("y=%#x\n", y); 	return 0; }仅供参考，y用的int型  这样虽然可以，但是如果Y1中的数据比较大的话计算后会超出int的范围的吧。。所以我才想是用double类型来接收的。

user: user-8
content: #include<stdio.h>  int main(void) {  	unsigned char Y1[4]; 	int y = 0;     int i;  	Y1[0]=0x01;     Y1[1]=0x02;     Y1[2]=0x03;     Y1[3]=0x04; 	 	for(i = 3; i>=0; i--) 		y = (y << 8) + Y1[i]; 	printf("y=%#x\n", y); 	return 0; }仅供参考，y用的int型