面试失利后,才知道计算机字节序的重要性-大小端字节序

最近朋友“__壹号__”在面试过程中碰到了这样一个问题?

面试官问题1:关于计算机字节序您了解吗?

面试官问题2:字节序存在的意义是什么?

面试官问题3:不同字节序的计算机与内存交互是怎样的?

面试官问题4:网络字节序是值什么字节序?

面试官问题5:字节序转换函数您了解吗?

__壹号__:额,.....

对于上面问题“__壹号__”同学显然回答的不是很好,下面咱们就来依次说一说上面那些问题都应该怎样理解呢?其对应的计算机知识又是那些呢?

本篇文章将介绍前面五个问题中的前三个:

问题1-2:计算机字节序是什么及字节序的意义?

       计算机字节序:计算机字节序是指计算机对于字节、字等的存储机制。目前在各种体系的计算机结构中通常采用的存储机制有两种:Big-Endian(大端字节序)以及Little-Endian(小端字节序)。

       字节序的意义:在各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了计算机通信领域中一个很重要的问题,即通信双方交流的信息单元(比特、字节、字、双字等等)应该以什么样的顺序进行传送。如果不达成一致的规则,通信双方将无法进行正确的编/译码从而导致通信失败。字节序的出现解决了这个问题,使得通信双方可以根据字节序,获得对方发送的正确数据。

问题3:不同字节序的计算机与内存交互是怎样的?

从上面可以了解到字节序分为大端与小端,我们来先了解一下大小端字节序及其与内存的交互:

大小端到底是什么?

大小端说的就是字节序,也就是一个数值需要多个字节的存储空间时,这多个字节存储在内存中的顺序。

系统向内存存储数值:

大端模式:将数值的高字节位存放在内存低地址,低字节位放在内存高地址

小端模式:将数值的高字节位存放在内存高地址,低字节为存放在内存低地址

举例:以16进制数值0x1234为例,低位字节为0x34,高位字节为0x12(ps:高位在前,低位在后,不理解的可以转换为二进制即可理解)

大端模式

       在大端的服务器内存中,存储方式如下图1,高位字节存储在内存低地址中,低位字节存储在内存高地址中。大端模式比较符合人眼的视觉顺序(从左到右,由低到高)。

     

小端模式

       在小端的服务器内存中,存储方式如下图2,高位字节存储在内存高地址中,低位字节存储在内存低地址中。小端模式比较符合计算机顺序(低字节存低内存,高字节存高内存)。

      

系统从内存中的读取数值

大端模式:将高地址内存中的数值放在数值的低字节位,将低地址内存中的数值放在高字节位。

小端模式:将高地址内存中的数值放在数值的高字节位,将低地址内存中的数值放在低字节位。

举例:以16进制数值0x1234为例,假设在内存中存入顺序为下图3,内存低地址存数值0x34,内存高地址字节为0x12,下面我们来探讨下,不同字节序的服务器读取的数值有什么不同。

大端模式

       在大端服务器获取这块内存中的数值时,其会将从内存高地址获取到的数值放在数值的低字节位,反之就放在高字节位。其在读取内存时,发现内存高地址数值为0x12,内存低地址数值为0x34,最后得到数值:0x3412,图示如下图4:

   

小端模式

       在小端服务器获取这块内存中的数值时,其会将从内存高地址获取到的数值放在数值的高字节位,反之就放在低字节位。其在读取内存时,发现内存高地址数值为0x12,内存低地址数值为0x34,最后得到数值:0x1234,图示如下图4:

      

       

到这呢就基本可以达到回答上面三个问题的标准,但作为一个想要在技术道路上更近一层的boy,我们当然要了解一些课外知识。

延展1:哪些计算机系统属于大端,哪些又属于小端呢?

  • 大小端是由cpu以及操作系统决定的,具体实现大小端是通过操作系统,cpu与内存交互过程
  • Intelx86都为小端而 HP-PA NT属于大端,也就是说我们平时的intel处理器服务器绝大多数都是小端服务器。

延展2:如何辨别自己的计算机的字节序呢?

       这里就要用到代码了,方法也非常多,简单来说,就是创建一个占用多个字节的数值A(最好是十六进制,这样看起来比较直观),然后把这个数值强转成占用1个字节的数值B(这一个字节,属于原数值在内存低地址中所存的值),看B在A中的位置是高字节还是低字节位,如果是低字节为小端,反之为大端。下面代码用来判断当前机器是否为小端。

int is_little_endian()
{
    unsigned short num = 0x1234;
    if(*((char *)&num)==0x34)
        return 1;
    return 0;
}

以上就是本博客内容,下一篇会继续将后两个问题的相关内容,大家有问题可以共同探讨。

发布了1 篇原创文章 · 获赞 3 · 访问量 45

猜你喜欢

转载自blog.csdn.net/JianChiBieFei/article/details/105325397
今日推荐