面试说的字节序大小端你懂吗

  应届生面试常考大小端,所以本篇来说说大小端内容

  我们知道ARM处理器对于数据的存放在内存上会有差异,而这些差异就是我们常常说的大端存储模式和小端存储模式。比如一个16位short类型变量X在内存中的地址为0x0010,X的值为0x1122,所有CPU看到的字节序都是0x11是高字节序,0x22是低字节序。对于大端模式CPU下,就会将0x11数据放在内存的低地址上面,0x22放在内存的高地址上面。对于小端模式CPU下,就会将0x11数据放在内存低地址,0x22数据放在内存高地址。很多ARM处理器都是小端模式,不过也有ARM处理器是大端模式下,具体还要看CPU手册。大小端模式在处理器访问内存时用于描述寄存器的字节顺序和内存中的字节时用于描述寄存器的字节顺序和内存中的字节顺序之间的关系。

  大端模式是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中。

  32位CPU在大端模式下,0x12345678在内存中的摆放位置:

  低地址 ---> 高地址0000 0100: 1234 5678 0000 0000 0000 0000 0000 00000000 0110: 0000 0000 0000 0000 0000 0000 0000 0000

  12是高字节序,78是低字节序,12是在低地址上,78是在高地址上,所以大端模式下的地址的增长顺序与值的增长顺序相同。

  小端模式下,0x12345678在内存中的摆放位置:

  低地址 ---> 高地址0000 0100: 7856 3412 0000 0000 0000 0000 0000 00000000 0110: 0000 0000 0000 0000 0000 0000 0000 0000

  12是高字节序,78是低字节序,12是在高地址上,78是在低地址上,所以小端模式下的地址的增长顺序与值的增长顺序相反。

  从上面大小端模式的内存视图可知,同样是读取0x1234 5678,但是该值在内存中的布局不一样。

  在Linux操作系统中,用这个

  readelf -a

  命令加一个可执行文件可以查看大小端的情况

  编辑

  切换为居中

  添加图片注释,不超过 140 字(可选)

  联合体的存放顺序是所有成员都从低地址开始存放,利用该特性可以轻松判断CPU对内存采用大端模式还是小端模式读写。

  #include<stdio.h> union test{ int a; //占4个字节 char b[4]; //占一个字节 }t = {0x12345678};//还是拿0x12345678为例 int main(){ int i = 0; for(i = 0 ; i < 4 ; i++) { printf("%x

  ",t.b[i]); } return 0;}

  编译得到

  编辑

  添加图片注释,不超过 140 字(可选)

  先打印出来的低地址的值0x78,说明低地址存放低字节序内容是小端模式。反之是大端。

  相信这里大家应该懂了大小端原理了吧。觉得有用,点赞+关注

  举报/反馈