首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

c语言内存值,该如何处理

2013-11-21 
c语言内存值请教大神:假如我写一个关于浮点数的程序,float a0.1,等等,我怎么在程序运行的时候输出内存值

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++;
}
[解决办法]
调试的时候 看内存!
[解决办法]

引用:
float a = 0.1;
byte * pbyte = (byte *)&a;
for (int i = 0; i < sizeof(a); i++)
{
    cout << (int)*pbyte << endl;
    pbyte++;
}
+1
[解决办法]
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对应的汇编并单步执行观察相应内存和寄存器变化。)

[解决办法]
引用:
Quote: 引用:


#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所在的内存值打印输出出来了,谢谢,不过如果很多行程序,怎么找到想要的程序行,将其对应的内存打印输出


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;
}


想看一个内存值,需要这么麻烦?直接打开调试器就可以了
[解决办法]
引用:
Quote: 引用:

调试的时候 看内存!
调试的时候看了,因为内存中的值对以后有用,所以想输出在文档中
二进制。 数据在底层存储 都是二进制的形式!调试的时候 选择内存查看 你会看到一些16进制的表示。 float 是四个字节,那就这样子
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位,在数据的传输过程中也有误差
深入理解计算机系统  有讲

理解:整型数据最精确

热点排行
Bad Request.