c语言内存值
请教大神:假如我写一个关于浮点数的程序,float a=0.1,等等,我怎么在程序运行的时候输出内存值到文本中,因为0.1不能用二进制准确表示,所以我想看内存值和0.1有多少误差。
另外,如果是一段大程序,怎么能区别内存中值和自己定义的变量名对应。
初学,不懂,希望给指导下,看什么书,能将程序运行时,内存中的值和相应指令对照输出
[解决办法]
float a = 0.1;
byte * pbyte = (byte *)&a;
for (int i = 0; i < sizeof(a); i++)
{
cout << (int)*pbyte << endl;
pbyte++;
}
[解决办法]
调试的时候 看内存!
[解决办法]
[解决办法]
cout << (int)*pbyte << endl;貌似结果不是给人看的,不如直接2进制模式存入文件,非要文本模式就每byte转成2位的hex数字较妥...
[解决办法]
a、b的值就存储在它们两个变量中,至于地址,取地址即可,比如&a ...
内存中的数据是二进制,当然不存在类型,你想要什么类型,就转换成什么类型即可。
[解决办法]
#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;
}
[解决办法]
把对应的代码的行号打印出来不就行了吗
[解决办法]
计算机组成原理→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对应的汇编并单步执行观察相应内存和寄存器变化。)
[解决办法]
printf("%p");打印出去来地址,把每一个字节的地址都循环打印出来,对比就知道了阿!
[解决办法]
#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;
}
想看一个内存值,需要这么麻烦?直接打开调试器就可以了
[解决办法]
调试的时候看了,因为内存中的值对以后有用,所以想输出在文档中
调试的时候 看内存!
float a;char ch[4];memcpy(ch,&a,4);
这样子 你就把float转换成底层存储的形式,然后写入文件 fwrite(ch,4,1,file)
[解决办法]
#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
//
[解决办法]
内存中的值是二进制的,任何转换都是有误差的。
FPU 中的浮点数寄存器的位数可能超过 64位,在数据的传输过程中也有误差
深入理解计算机系统 有讲
理解:整型数据最精确