大小端字节序问题及习题分析

来源:互联网 发布:傲剑屠龙刀数据大全 编辑:程序博客网 时间:2024/06/03 17:18

在看大小端问题之前,我们先来看看什么是大小端字节序

大端字节序:高位低地址,低位高地址

小端字节序:低位低地址,高位高地址


 那么我们知道大小端字节序能干什么呢?

我们可以知道当前机器的存储方式,我们来写个代码测试一下   (注:在vs2012下编译的)

#include<stdio.h>
#include<stdlib.h>
int check()
{
int i = 1; //这里取1,是因为1的二进制比较简单,如果我们选取一个比较大的数,我们在判断的时候还要计算一下高地址或者低地址放的是什么 ,当然也没必要这么坑自己
int *p =  &i;  //取i的首地址给指针P,因为i是整型的,所以我们给个整形指针去存放i的首地址
if(*p==1)  //根据上面画的图给出判断

 return 1
}
else if(*p==0)
{
  return 0;
}
else
{
  return -1;
}


}
int main()
{
    
int ret = 0; 
ret = check(); // 让ret去接受check()函数的返回值
if(ret==1)
{
  printf("大端字节序");
}
if(ret==0)
{
  printf("小端字节序");
}
if(ret==-1)
{
  printf("ERROR");
}

        printf("\n");
system ("pause");
return 0;
}

然后我们来看下我们的运行结果:


当然,知道这个你还可以解答c/c++的面试题哦, 我们来看一下这样一道面试题

  假设在一个32位机little endian 机器上运行以下程序,结果为?

#include<stdio.h>

int main()
{
    long long a = 1 ,b = 2,c = 3;
printf("%d,%d,%d",a,b,c);

        return 0;

}

这是一道填空题,代码也很短,我们来分析一下

首先,题目明确规定是在小端字节序机器上的,那么我们需要注意想想小端是如果存储的,其次 a,b,c都是long long类型的变量,占8字节,而却以%d的形式输出的,%d是以十进制输出,也就是说输出的是个int型,占4字节,那这里我们就需要注意了,最后printf函数的参数是从右向左入栈的,压栈的时候应该是先压c,在压b,最后压a;

明确了这些之后,我们就可以得出结论了,那么,在画个图看看



  

 

0 0
原创粉丝点击