一个关于变量数据显示的问题

来源:互联网 发布:淘宝西装 编辑:程序博客网 时间:2024/04/28 02:10

 

/*这是一个检测电脑是按照小端还是大端存储的列子*/
#include "stdio.h"
typedef unsigned char *byte_pointer;
/*上面这句话代表"byte_pointer"等同于"unsigned char *" */
 
void show_bytes(byte_pointer start, int len)
{
int i;
for(i=0;i<len;i++)
printf("%.2x",start[i]);
printf("/n");
}
 
void show_int(int x)
{
show_bytes((byte_pointer)&x,sizeof(int));
}
/* "(byte_pointer)&x"表示将"&x"强制格式化为变量类型"byte_pointer" */
/* "sizeof(int)"是一个数值,是int所占字节的数目 */
 
void show_float(float x)
{
show_bytes((byte_pointer)&x,sizeof(float));
}
 
void show_pointer(void *x)
{
show_bytes((byte_pointer)&x,sizeof(void *));
}
 
void test_show_bytes(int wal)
{
int iwal = wal;
float fwal = (float) iwal;/*16进制只能显示整数部分*/
int *pwal = &iwal;
show_int(iwal);
show_float(fwal);
show_pointer(pwal);
}
 
int main()
{
 int i=0x00003039;
test_show_bytes(i);
 return 0;
}
我在的电脑上运行了这个程序。得到的结果是:
39300000
00e44046
9caec0bf
从第一行可以看出,我的电脑是按照小端法存储的。这个没有什么争议。可是问题是,自从第二行起的剩下2行数据我就看不懂怎么来的了。比如说第二行数据“00e44046”这组数据我运行过多次程序,第二行就是这组数据不会变的。也就是说,第二行的数据时由于程序的执行而的来的。但是问题就来了。这组数据时怎么计算而的来的我就不从而知了。我做过如下的测试程序:
#include "stdio.h"
int main()
{
  int i,k;
  float f;
  unsigned char *c , *d;
  i = 0x00003039;
  f = (float)i;
  c = (unsined char *) &f;
  d = (unsined char *) &i;
  printf("%d/n%x/n",i,i);
  printf("%.2f/n%.2x/n",f,f);
  for(k=0;k < sizeof(int) ; k++)
  printf("%x",d[i]);
  printf("/n");
  for(k=0 ; k < sizeof(float) ; k++)
  printf("%.2",c[i]);
  printf("/n");
  return 0;
}
这个程序的运行结果是:
12345
3039
12345.000000
00
39300000
00e44046
从这个程序我们可以看出对于float 类型的变量16进制无法显示,它就显示出两个0。别的什么都没有,但是16进制的数据可以赋值给float类型的变量。我们也可以看出对于int类型的变量,当我把int 类型的变量的地址类型转换成unsigned char类型地址后我按字节数显示int变量存储的数据的时候没有什么异常。它按照变量存储的地址依次从最低的地址到高地址显示存储的数据。但是同样的问题到了float类型变量那里就行不通了,这就怪异了。而且每次显示的数据都是一样的,也就是说这个显示的不是乱码。哪到底是为什么会显示这样的数据呢??
还有void类型的指针变量时就更怪了。每次运行程序的时候,显示都是不一样。这里其中到底有什么不同?请问能有高手帮忙指点不??
原创粉丝点击