字节序和大小端

字节序和大小端

大小端大家都熟悉吧
但是笔者在面试的时候被问到还是能说出口的超不过三句话
越是简单的东西,越不能大意。

大小端的概念

在计算机中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit,但并非所有类型都只占一个字节,很多类型大小都是多个字节。所以有了字节序这个概念

32位编译器下

  • char :1个字节
  • short int : 2个字节
  • int:4个字节
  • unsigned int : 4个字节
  • float: 4个字节
  • double: 8个字节
  • long: 4个字节
  • long long: 8个字节

在32位编译器下,所有的指针都占4个字节,而数组名在编译的时候就已经绑定了其相关的数组信息,因此对数组名求sizeof是所有数组中数据的大小和;

64位编译器下

  • char :1个字节
  • short int : 2个字节
  • int: 4个字节
  • float: 4个字节
  • double: 8个字节
  • long: 8个字节
  • long long: 8个字节

同理数组名求sizeof的方法不变,在64位编译器下,所有的指针都占8字节;

大端存储

大端存储就是低位字节存放在高地址端;高位字节存放在低地址端;

小端存储

小端存储就是低位字节存放在低地址端;高位字节存放在高地址端;

我们常用的X86结构的都是小端模式;

那么可以怎么来判断这个主机是大端存储还是小段存储?
1.类型强制转换判断

#include 
int main()
{
    int n = 1;
    char *m = (char *)&n;
    if(*m == 1)
        printf("小端\n");
    else
        printf("大端\n");
    return 0;
}

上面这段代码,通过强转int类型的指针,为char类型,char只占一个字节,而int占四字节,char会获取int的低地址端的一字节;

如果*m=1,就说明,获取的低地址段的字节是低位字节,反之如果是大端存储的话,得到的就是高位字节就不是1了;

2.共用体(联合体)

  • 本质思想也是一个类型的强转;

首先什么是共用体?

在进行某些算法的C语言编程的时候,需要使几种不同类型的变量存放到同一段内存单元中。也就是使用覆盖技术,几个变量互相覆盖。这种几个不同的变量共同占用一段内存的结构,在C语言中,被称作“共用体”类型结构,简称共用体。注:在某些书籍中可能称之为“联合体”,但是“共用体”更能反映该类型在内存的特点。

来自度娘

 union
    {
        int m;
        char n;
    }un;
    un.m = 1;
    return un.n;

再来看这段代码(精要部分)

其实原理和上面是一样的,共用体会以占内存最大的类型来分配内存,其他变量都是用这块内存,

先给int类型的m赋值为1,通过返回时强转成char类型看是否值为1,和第一个方法一样,若为1则是小端存储,反之则是大端存储。

你可能感兴趣的:(C)