user-0 提问: c语言内存值

回复:
user: user-0
content: 引用 16 楼 zhao4zhong1 的回复:#include <stdio.h> float f=0.1f; double d=0.1; int i; int main() {     printf("float  %g in memory:",f);for (i=0;i<sizeof(float );i++) printf(" %02X",((unsigned char *)&f)[i]);printf("\n");     printf("double %g in memory:",f);for (i=0;i<sizeof(double);i++) printf(" %02X",((unsigned char *)&d)[i]);printf("\n");     return 0; } //float  0.1 in memory: CD CC CC 3D //double 0.1 in memory: 9A 99 99 99 99 99 B9 3F // 谢谢，我想是打印出内存，如果直接打印输出大整数，我还得转换成二进制，这样就方便多了，学习了！！！

user: user-1
content: 内存中的值是二进制的，任何转换都是有误差的。  FPU 中的浮点数寄存器的位数可能超过 64位，在数据的传输过程中也有误差 深入理解计算机系统  有讲  理解：整型数据最精确

user: user-2
content: #include <stdio.h> float f=0.1f; double d=0.1; int i; int main() {     printf("float  %g in memory:",f);for (i=0;i<sizeof(float );i++) printf(" %02X",((unsigned char *)&f)[i]);printf("\n");     printf("double %g in memory:",f);for (i=0;i<sizeof(double);i++) printf(" %02X",((unsigned char *)&d)[i]);printf("\n");     return 0; } //float  0.1 in memory: CD CC CC 3D //double 0.1 in memory: 9A 99 99 99 99 99 B9 3F //

user: user-3
content: float a = 0.1; byte * pbyte = (byte *)&a; for (int i = 0; i < sizeof(a); i++) {     cout << (int)*pbyte << endl;     pbyte++; }

user: user-4
content: #include <stdio.h>  int IsBigEndian(void) { 	union _un_st 	{ 		unsigned int a; 		unsigned char b; 	}un_st;  	un_st.a = 0x01020304; 	if (un_st.b = 0x01) 	{ 		return 1; 	}  	return 0; }  int main(void) {     int i = 0;     char *p = NULL;     float f = 0.1f;      p = (char*)&f;  	if (IsBigEndian()) 	{ 		for (i = sizeof(f) - 1; i >= 0; i--) 		{ 			printf("f[%d]Byte = %#x\n", 3 - i, *(unsigned char *)(p+i)); 		} 	} 	else 	{ 		for (i = 0; i < sizeof(f); i++) 		{ 			printf("f[%d]Byte = %#x\n", i, *(unsigned char *)(p+i)); 		} 	}      return 0; }

user: user-5
content: a、b的值就存储在它们两个变量中，至于地址，取地址即可，比如&a ... 内存中的数据是二进制，当然不存在类型，你想要什么类型，就转换成什么类型即可。

user: user-0
content: 引用 1 楼 caozhy 的回复:float a = 0.1; byte * pbyte = (byte *)&a; for (int i = 0; i < sizeof(a); i++) {     cout << (int)*pbyte << endl;     pbyte++; }  引用 6 楼 angel_su 的回复:cout << (int)*pbyte << endl;貌似结果不是给人看的，不如直接2进制模式存入文件，非要文本模式就每byte转成2位的hex数字较妥...  引用 5 楼 junlinfushi 的回复:[quote=引用 1 楼 caozhy 的回复:] float a = 0.1; byte * pbyte = (byte *)&a; for (int i = 0; i < sizeof(a); i++) {     cout << (int)*pbyte << endl;     pbyte++; }+1[/quote] 可能我的问题还没说清楚，我现在的问题是，如下图， 我随便写个小程序右侧，左侧是我跟踪的到地址和内存中的值（类型转换输出的），这个程序执行完需要好几万的指令，地址是指令地址，太多了，我想要找到存储a,b的地址和a、b？的值。这需要学习哪些知识，而且内存中的值都是二进制，无法断定是数据类型！！？？各位大大有啥建议码

user: user-6
content: 引用 4 楼 asdwt123 的回复:引用 2 楼 king1076 的回复:调试的时候 看内存！调试的时候看了，因为内存中的值对以后有用，所以想输出在文档中二进制。 数据在底层存储 都是二进制的形式！调试的时候 选择内存查看 你会看到一些16进制的表示。 float 是四个字节，那就这样子 float a;char ch[4];memcpy(ch,&a,4); 这样子 你就把float转换成底层存储的形式，然后写入文件 fwrite（ch,4,1,file)

user: user-7
content: cout << (int)*pbyte << endl;貌似结果不是给人看的，不如直接2进制模式存入文件，非要文本模式就每byte转成2位的hex数字较妥...

user: user-8
content: 引用 1 楼 caozhy 的回复:float a = 0.1; byte * pbyte = (byte *)&a; for (int i = 0; i < sizeof(a); i++) {     cout << (int)*pbyte << endl;     pbyte++; }+1

user: user-0
content: 引用 2 楼 king1076 的回复:调试的时候 看内存！调试的时候看了，因为内存中的值对以后有用，所以想输出在文档中

user: user-0
content: 引用 1 楼 caozhy 的回复:float a = 0.1; byte * pbyte = (byte *)&a; for (int i = 0; i < sizeof(a); i++) {     cout << (int)*pbyte << endl;     pbyte++; }这个byte怎么定义的。。。很菜，不明白

user: user-6
content: 调试的时候 看内存！

user: user-9
content: 引用 9 楼 lgbxyz 的回复: #include <stdio.h>  int IsBigEndian(void) { 	union _un_st 	{ 		unsigned int a; 		unsigned char b; 	}un_st;  	un_st.a = 0x01020304; 	if (un_st.b = 0x01) 	{ 		return 1; 	}  	return 0; }  int main(void) {     int i = 0;     char *p = NULL;     float f = 0.1f;      p = (char*)&f;  	if (IsBigEndian()) 	{ 		for (i = sizeof(f) - 1; i >= 0; i--) 		{ 			printf("f[%d]Byte = %#x\n", 3 - i, *(unsigned char *)(p+i)); 		} 	} 	else 	{ 		for (i = 0; i < sizeof(f); i++) 		{ 			printf("f[%d]Byte = %#x\n", i, *(unsigned char *)(p+i)); 		} 	}      return 0; }  想看一个内存值，需要这么麻烦？直接打开调试器就可以了

user: user-10
content: 引用 10 楼 asdwt123 的回复:[quote=引用 9 楼 lgbxyz 的回复:]  #include <stdio.h>  int IsBigEndian(void) { 	union _un_st 	{ 		unsigned int a; 		unsigned char b; 	}un_st;  	un_st.a = 0x01020304; 	if (un_st.b = 0x01) 	{ 		return 1; 	}  	return 0; }  int main(void) {     int i = 0;     char *p = NULL;     float f = 0.1f;      p = (char*)&f;  	if (IsBigEndian()) 	{ 		for (i = sizeof(f) - 1; i >= 0; i--) 		{ 			printf("f[%d]Byte = %#x\n", 3 - i, *(unsigned char *)(p+i)); 		} 	} 	else 	{ 		for (i = 0; i < sizeof(f); i++) 		{ 			printf("f[%d]Byte = %#x\n", i, *(unsigned char *)(p+i)); 		} 	}      return 0; } 验证这个，确实将0.1所在的内存值打印输出出来了，谢谢，不过如果很多行程序，怎么找到想要的程序行，将其对应的内存打印输出[/quote]  printf("%p");打印出去来地址，把每一个字节的地址都循环打印出来，对比就知道了阿！

user: user-2
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-11
content: 把对应的代码的行号打印出来不就行了吗

user: user-0
content: 引用 9 楼 lgbxyz 的回复: #include <stdio.h>  int IsBigEndian(void) { 	union _un_st 	{ 		unsigned int a; 		unsigned char b; 	}un_st;  	un_st.a = 0x01020304; 	if (un_st.b = 0x01) 	{ 		return 1; 	}  	return 0; }  int main(void) {     int i = 0;     char *p = NULL;     float f = 0.1f;      p = (char*)&f;  	if (IsBigEndian()) 	{ 		for (i = sizeof(f) - 1; i >= 0; i--) 		{ 			printf("f[%d]Byte = %#x\n", 3 - i, *(unsigned char *)(p+i)); 		} 	} 	else 	{ 		for (i = 0; i < sizeof(f); i++) 		{ 			printf("f[%d]Byte = %#x\n", i, *(unsigned char *)(p+i)); 		} 	}      return 0; } 验证这个，确实将0.1所在的内存值打印输出出来了，谢谢，不过如果很多行程序，怎么找到想要的程序行，将其对应的内存打印输出