user-0 提问: 请问手工填充double的内存后，怎么样能准确输出这个值？

回复:
user: user-0
content: 引用 3 楼 cfjtaishan 的回复:把数据存放在double数据里是没问题的，但是以lf输出是0，这是有可能的。因为double类型和整型数据在内存里的存放方式不一样的，建议看一下double在内存里存放格式； 建议把你的代码贴出来，主要看一下你是如何把8个字节放到double里的。 下面是个人的赋值方式：  #include <stdio.h> #include <string.h>  int main(void) {     double d;     char ch[] = {0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0};      memcpy(&d, ch, 8);      printf("%lf\n", d);      memset(ch, 0, 8);     memcpy(ch, &d, 8);      int i;     for (i = 0; i < 8; i++)         printf("%#x\n", ch[i]);      return 0; }  解决了 double有效位数16位 默认输出不精确    引用 3 楼 cfjtaishan 的回复:把数据存放在double数据里是没问题的，但是以lf输出是0，这是有可能的。因为double类型和整型数据在内存里的存放方式不一样的，建议看一下double在内存里存放格式； 建议把你的代码贴出来，主要看一下你是如何把8个字节放到double里的。 下面是个人的赋值方式：  #include <stdio.h> #include <string.h>  int main(void) {     double d;     char ch[] = {0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0};      memcpy(&d, ch, 8);      printf("%lf\n", d);      memset(ch, 0, 8);     memcpy(ch, &d, 8);      int i;     for (i = 0; i < 8; i++)         printf("%#x\n", ch[i]);      return 0; }  问题解决了  是能正常输出的 只是默认输出有效位数太短了

user: user-1
content: 电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-2
content: 还是不太明白，或许用联合比较好一些union data { 	double d; 	char str[8]; };这样？

user: user-0
content: 引用 10 楼 wqte45 的回复:[quote=引用 9 楼 cfjtaishan 的回复:] [quote=引用 7 楼 wqte45 的回复:] [quote=引用 3 楼 cfjtaishan 的回复:] 把数据存放在double数据里是没问题的，但是以lf输出是0，这是有可能的。因为double类型和整型数据在内存里的存放方式不一样的，建议看一下double在内存里存放格式； 建议把你的代码贴出来，主要看一下你是如何把8个字节放到double里的。 下面是个人的赋值方式：  #include <stdio.h> #include <string.h>  int main(void) {     double d;     char ch[] = {0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0};      memcpy(&d, ch, 8);      printf("%lf\n", d);      memset(ch, 0, 8);     memcpy(ch, &d, 8);      int i;     for (i = 0; i < 8; i++)         printf("%#x\n", ch[i]);      return 0; }  是这样的 我就是想利用double的八个字节存放字符串数据   我是这样 存放数据的，但是 却无法输出准确的 double值  没有准确的double值出来  我就无法打印出填充的字符串啊 [/quote] 你用%lf输出不行，不等于double里的存放的值不是你存放的值 你的程序已经证明了，a中存放的值就是你输入的值。之所以输出的是0.00000，这个要查浮点数在内存中存放格式，你输入的数据，以%lf输出，那么就按照双精度浮点数的格式从内存里读。[/quote]  那就没办法 获取这个准确的 浮点数了吗 我就是想用  double a=******; printf("%s",&a);  来实现我填充的字符串   但前提是给double赋值要准确。。这个怎么办呢？[/quote]   我是想得到这样的值：  #include"stdio.h" int main() {     float a[3] = { 1143139122437582505939828736.0, 76482007234779498639230238720.0, 9.222452464e-39 };     printf("%s",a);      return 0; } 打印出 hello word

user: user-3
content: 引用 10 楼 wqte45 的回复:[quote=引用 9 楼 cfjtaishan 的回复:] [quote=引用 7 楼 wqte45 的回复:] [quote=引用 3 楼 cfjtaishan 的回复:] 把数据存放在double数据里是没问题的，但是以lf输出是0，这是有可能的。因为double类型和整型数据在内存里的存放方式不一样的，建议看一下double在内存里存放格式； 建议把你的代码贴出来，主要看一下你是如何把8个字节放到double里的。 下面是个人的赋值方式：  #include <stdio.h> #include <string.h>  int main(void) {     double d;     char ch[] = {0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0};      memcpy(&d, ch, 8);      printf("%lf\n", d);      memset(ch, 0, 8);     memcpy(ch, &d, 8);      int i;     for (i = 0; i < 8; i++)         printf("%#x\n", ch[i]);      return 0; }  是这样的 我就是想利用double的八个字节存放字符串数据   我是这样 存放数据的，但是 却无法输出准确的 double值  没有准确的double值出来  我就无法打印出填充的字符串啊 [/quote] 你用%lf输出不行，不等于double里的存放的值不是你存放的值 你的程序已经证明了，a中存放的值就是你输入的值。之所以输出的是0.00000，这个要查浮点数在内存中存放格式，你输入的数据，以%lf输出，那么就按照双精度浮点数的格式从内存里读。[/quote]  那就没办法 获取这个准确的 浮点数了吗 我就是想用  double a=******; printf("%s",&a);  来实现我填充的字符串   但前提是给double赋值要准确。。这个怎么办呢？[/quote] 首先这个浮点数是没问题的，问题是按照你输入的数值（8个字节存放）输出的值就是0.00000 我的意思，输入到a和输出的a都没问题。 看一下我下面的代码修改： #include <stdio.h> #include <string.h>  int main(void) {     double d;     char ch[] = {0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0};      memcpy(&d, ch, 8);      printf("%lf\n", d);      memset(ch, 0, 8);     memcpy(ch, &d, 8);      puts((char *)&d);     char *pc = (char *)&d;     puts(pc);     /*     int i;     for (i = 0; i < 8; i++)         printf("%#x\t", pc[i]);     putchar(10);      for (i = 0; i < 8; i++)         printf("%#x\n", ch[i]);     */     return 0; }

user: user-0
content: 引用 9 楼 cfjtaishan 的回复:[quote=引用 7 楼 wqte45 的回复:] [quote=引用 3 楼 cfjtaishan 的回复:] 把数据存放在double数据里是没问题的，但是以lf输出是0，这是有可能的。因为double类型和整型数据在内存里的存放方式不一样的，建议看一下double在内存里存放格式； 建议把你的代码贴出来，主要看一下你是如何把8个字节放到double里的。 下面是个人的赋值方式：  #include <stdio.h> #include <string.h>  int main(void) {     double d;     char ch[] = {0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0};      memcpy(&d, ch, 8);      printf("%lf\n", d);      memset(ch, 0, 8);     memcpy(ch, &d, 8);      int i;     for (i = 0; i < 8; i++)         printf("%#x\n", ch[i]);      return 0; }  是这样的 我就是想利用double的八个字节存放字符串数据   我是这样 存放数据的，但是 却无法输出准确的 double值  没有准确的double值出来  我就无法打印出填充的字符串啊 [/quote] 你用%lf输出不行，不等于double里的存放的值不是你存放的值 你的程序已经证明了，a中存放的值就是你输入的值。之所以输出的是0.00000，这个要查浮点数在内存中存放格式，你输入的数据，以%lf输出，那么就按照双精度浮点数的格式从内存里读。[/quote]  那就没办法 获取这个准确的 浮点数了吗 我就是想用  double a=******; printf("%s",&a);  来实现我填充的字符串   但前提是给double赋值要准确。。这个怎么办呢？

user: user-3
content: 引用 7 楼 wqte45 的回复:[quote=引用 3 楼 cfjtaishan 的回复:] 把数据存放在double数据里是没问题的，但是以lf输出是0，这是有可能的。因为double类型和整型数据在内存里的存放方式不一样的，建议看一下double在内存里存放格式； 建议把你的代码贴出来，主要看一下你是如何把8个字节放到double里的。 下面是个人的赋值方式：  #include <stdio.h> #include <string.h>  int main(void) {     double d;     char ch[] = {0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0};      memcpy(&d, ch, 8);      printf("%lf\n", d);      memset(ch, 0, 8);     memcpy(ch, &d, 8);      int i;     for (i = 0; i < 8; i++)         printf("%#x\n", ch[i]);      return 0; }  是这样的 我就是想利用double的八个字节存放字符串数据   我是这样 存放数据的，但是 却无法输出准确的 double值  没有准确的double值出来  我就无法打印出填充的字符串啊 [/quote] 你用%lf输出不行，不等于double里的存放的值不是你存放的值 你的程序已经证明了，a中存放的值就是你输入的值。之所以输出的是0.00000，这个要查浮点数在内存中存放格式，你输入的数据，以%lf输出，那么就按照双精度浮点数的格式从内存里读。

user: user-0
content: 下次问问题，请把自己的代码附上！找人帮忙，似乎还想留一手？很少人愿意帮的，你这种情况@thecentry    嗯嗯 虚心接收批评 ，其实 我觉得 我问题说的很清楚了  再说了那么简单的代码  就是给double8个字节填充了数据  但是打印这个浮点数据的结果貌似不那么精确 我觉得可能许需要贴这么简单的代码  就没贴了

user: user-0
content: 引用 3 楼 cfjtaishan 的回复:把数据存放在double数据里是没问题的，但是以lf输出是0，这是有可能的。因为double类型和整型数据在内存里的存放方式不一样的，建议看一下double在内存里存放格式； 建议把你的代码贴出来，主要看一下你是如何把8个字节放到double里的。 下面是个人的赋值方式：  #include <stdio.h> #include <string.h>  int main(void) {     double d;     char ch[] = {0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0};      memcpy(&d, ch, 8);      printf("%lf\n", d);      memset(ch, 0, 8);     memcpy(ch, &d, 8);      int i;     for (i = 0; i < 8; i++)         printf("%#x\n", ch[i]);      return 0; }  是这样的 我就是想利用double的八个字节存放字符串数据   我是这样 存放数据的，但是 却无法输出准确的 double值  没有准确的double值出来  我就无法打印出填充的字符串啊

user: user-1
content: 浮点数格式 http://bbs.csdn.net/topics/390676437

user: user-2
content: 没明白楼主要做啥。看你填的那些内容，不像是符合double格式的，解析出来自然是乱七八糟的

user: user-3
content: 把数据存放在double数据里是没问题的，但是以lf输出是0，这是有可能的。因为double类型和整型数据在内存里的存放方式不一样的，建议看一下double在内存里存放格式； 建议把你的代码贴出来，主要看一下你是如何把8个字节放到double里的。 下面是个人的赋值方式：  #include <stdio.h> #include <string.h>  int main(void) {     double d;     char ch[] = {0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0};      memcpy(&d, ch, 8);      printf("%lf\n", d);      memset(ch, 0, 8);     memcpy(ch, &d, 8);      int i;     for (i = 0; i < 8; i++)         printf("%#x\n", ch[i]);      return 0; }

user: user-3
content: 引用 1 楼 thecentry 的回复:#include<iostream> using namespace std; int main() { 	size_t d = 0; 	char s[8] = { 0x61, 		0x62, 		0x63, 		0x64, 		0x65, 		0x66, 		0x67, 		0x00 }; 	char k[8] = { 0 }; //	d = s[0]; 	for (int i = 0; i < 8; i++) 	{	 		d = d * int(pow(2, 8)); 		d += s[i]; 		 	} 	cout << d << endl; 	for (int j = 0; j < 8; j++) 	{ 		k[j] = d; 		d = d / int(pow(2, 8)); 	} 	for (int j = 0; j < 8; j++) 	{ 		 		cout<< hex<< int(k[j]) << endl; 	}  	return 0; }  下次问问题，请把自己的代码附上！找人帮忙，似乎还想留一手？很少人愿意帮的，你这种情况 这样做，直接逆序就可以得到了。没必要花费多次循环。 另外，size_t不一定就是8个字节，即不同的系统的编译器，size_t的字节数可能是不一样的。

user: user-4
content: 引用 3 楼 cfjtaishan 的回复:把数据存放在double数据里是没问题的，但是以lf输出是0，这是有可能的。因为double类型和整型数据在内存里的存放方式不一样的，建议看一下double在内存里存放格式； 建议把你的代码贴出来，主要看一下你是如何把8个字节放到double里的。 下面是个人的赋值方式：  #include <stdio.h> #include <string.h>  int main(void) {     double d;     char ch[] = {0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0};      memcpy(&d, ch, 8);      printf("%lf\n", d);      memset(ch, 0, 8);     memcpy(ch, &d, 8);      int i;     for (i = 0; i < 8; i++)         printf("%#x\n", ch[i]);      return 0; } 受教了！谢谢！你对API的应用的境界非我能级，自愧不如！

user: user-4
content: #include<iostream> using namespace std; int main() { 	size_t d = 0; 	char s[8] = { 0x61, 		0x62, 		0x63, 		0x64, 		0x65, 		0x66, 		0x67, 		0x00 }; 	char k[8] = { 0 }; //	d = s[0]; 	for (int i = 0; i < 8; i++) 	{	 		d = d * int(pow(2, 8)); 		d += s[i]; 		 	} 	cout << d << endl; 	for (int j = 0; j < 8; j++) 	{ 		k[j] = d; 		d = d / int(pow(2, 8)); 	} 	for (int j = 0; j < 8; j++) 	{ 		 		cout<< hex<< int(k[j]) << endl; 	}  	return 0; }  下次问问题，请把自己的代码附上！找人帮忙，似乎还想留一手？很少人愿意帮的，你这种情况