计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian)。

举例:

数值0x2211使用两个字节储存:高位字节是0x22,低位字节是0x11。

大端字节序:高位字节在前,低位字节在后,这是人类读写数值的方法。

小端字节序:低位字节在前,高位字节在后,即以0x1122形式储存。
    怎么去记才不会出错呢?
    其实只需要记住小端是低位字节存低位数据,高位字节存高位数据。(称为:低低高高)

同理:0x1234567的大端字节序和小端字节序的写法如下图:

由图中可以看出:大端小端字节序最小单位为1字节,即8bit;大端字节序就是和我们平时写法的顺序一样,从低地址—>高地址写入0x01234567;而小端字节序就是和我们平时的写法反过来,因为字节序最小单位为1字节,所以从低地址—>高地址写入0x67452301。

我一直不理解为什么要有字节序,每次读写都要区分,很麻烦!觉得统一使用大端字节序,就很方便。

读了一篇文章,解答了所有的疑问,首先,为什么要有小端字节序?
    
原因是:计算机电路优先处理低位字节,效率比较高,因为计算机都是从低位开始的。所以计算机内部处理都是小端字节序。

但是人类习惯读写大端字节序,所以除了计算机的内部处,其他的场理合都是大端字节序,比如网络传输和文件储存。

计算机处理字节序的时候,不知道什么是高位字节,什么是低位字节。它只知道按顺序读取字节,先读入第一个字节,再读第二个字节。如果是大端字节序,先读到的是就是高位字节,后读到的就是低位字节。小端字节序正好相反。

字节序的处理:只有读取的时候,才必须区分字节序,其他情况都不用考虑。
    
    字节序大小端的问题是各公司笔试题的热门,基本上每家公司都会考这样的题目,下面举几个例子,大家一起看一下:
1.如何用程序测试一个平台是大端模式,还是小端模式?
    这题目答案不唯一,有好多种方法都可以实现,我在这里就举两种方法吧,因为其实用那种方法,实现的思想都是一样的。
    ①利用union类型--可以利用union类型数据的特点:所有成员的起始地址一致,1存放在变量i的低位,当变量ch等于1时,就相当于将数据的低位存放到了内存的低地址处,即就是小端模式,反之就是大端模式,代码如下:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. union check
  3. {
  4. int i;
  5. char ch;
  6. }c;
  7. int main()
  8. {
  9. c.i = 1;
  10. c.ch == 1 ? printf("Little-endian/n") : printf("Big-endian/n");
  11. return 0;
  12. }

②对int强制类型转换,首先取出变量i的地址,强制转换为char *类型,再用*访问,代表取地址长度为1的内容,当取出内容等于1时,就相当于将数据的低位存放到了内存的低地址处,即就是小端模式,反之就是大端模式,

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. int i = 1;
  6. *(char *)&i == 1 ? printf("Little-endian/n") : printf("Big-endian/n");
  7. return 0;
  8. }

下面再看一道比较难的题,因为不止涉及到大小端的问题,还涉及到强制类型转换的相关问题:

2.在X86系统下,分别在大端模式和小端模式下,下面函数的值是多少,为什么,请画图说明?
    int main()

{

int a[4] = {1, 2, 3, 4};

int *ptr1 = (int *)(&a + 1);

int *ptr2 = (int *)((int)a + 1);

printf(“%x, %x”, ptr1[-1], *ptr2);

return 0;

}
    我们知道a表示数组首元素的首地址,(int *)(&a+1)就是把&a加1,再转化为int *,因为&a+1就指向a[5]了,ptr1[-1]又相当于ptr1指向了a[4];

还有(int)a+1就是把地址a转换int型加1,因为int类型是4个字节存储,(int)a+1就指向a[0]的第二个字节的指针了,如下图所示:

所以小端模式时:ptr1[-1] = 0x04
                             *ptr2 = 0x2000000

所以大端模式时:ptr1[-1] = 0x04
                             *ptr2 = 0x100

写的很棒!

转载自这里:

大小端字节序知识详解-帝国时代211-ChinaUnix博客

大小端字节序知识详解相关推荐

  1. 通信大小端字节序相关问题总结

    [备注:本文主要是将最新box项目中,遇到的问题做以总结梳理,便于加深印象和后续查阅.本文相关资料主要来源于网络,包括转载的一些资料] 遇到问题: 1.何为大.小端存储. 2.若协议中提及" ...

  2. Java字节序与大小端转换_什么时候要进行大小端字节序的转换? | 学步园

    什么时候要进行大小端字节序的转换? 通过socket收发数据(在intel的处理器上), 什么时候要进行大小端字节序的转换? 比如发一个int型的数据出去,要不要进行转换? 还是两端一样,就不用考虑转 ...

  3. 什么时候要进行大小端字节序的转换?

    什么时候要进行大小端字节序的转换? 通过socket收发数据(在intel的处理器上), 什么时候要进行大小端字节序的转换? 比如发一个int型的数据出去,要不要进行转换? 还是两端一样,就不用考虑转 ...

  4. 大小端字节序介绍以及判断当前环境字节序的程序【C语言】

    文章目录 1.大小端字节序介绍 2. 判断当前环境的字节序程序 1.大小端字节序介绍 首先我们先来介绍什么是大端字节序,什么是小端字节序: 大小端字节序指的是数据在电脑上存储的字节顺序 小端字节序存储 ...

  5. 【C语言】大小端字节序判断 常见笔试题型

    [前言]大家好,我是Catzzz666,一个一心让大家变强的博主.废话不说,让我们进入今天的正题. 大小端的引入: 我们先来看这样一段代码: 在内存中我们创建了局部变量a,那么a在内存中又是如何存储的 ...

  6. java 大小端字节序_理解大小端字节序

    学过编程的人都应该知道大小端字节序的概念,但是很多时候,总是把他们弄混,这是整理出来的一份很简单的方式理解字节序的文章,废话不多说,这里直接入正题. 什么是字节序? 字节序,简单来说,就是指的超过一个 ...

  7. 大小端字节序(存储)——百度,华为,腾讯,深信服大厂面试题(详解)

    如果你听懂了我所讲述的内容我们离大厂offer又进了一步!!! 一.介绍 维基百科:字节顺序,又称端序或尾序(英语:Endianness),在计算机科学领域中,指电脑内存中或在数字通信链路中,组成多字 ...

  8. 对于类对象模型的理解(类大小计算+大小端字节序)

    类对象模型 如何理解类与对象 类: 通俗理解,类相当于一个模型框架,限定了类有哪些成员变量,但从底层来看,内存并没有分配实际的物理空间来存储类 对象: 类对象即为类的具体描述,当类对象进行实例化过程中 ...

  9. 网络编程大小端字节序

    刚接触网络编程那会因为是同一种语言之间做数据交互所以并没有出现大小端问题,到后来鄙人因机缘巧合进入物联网行业然后就发现打开了新世界.(设备终端大多是嵌入式设备用的C,服务端用的是java) 然后我的状 ...

最新文章

  1. seaborn clustermap详解及绘制
  2. 5位Mixin Network SDK作者分别获赠价值4千美金的50个XIN token
  3. MongoDB之Hadoop驱动介绍
  4. thymeleaf与jsp_PagingAndSortingRepository –如何与Thymeleaf一起使用
  5. rhel 8.2不识别unicode_基于tensorflow 实现端到端的OCR:二代身份证号识别
  6. java 单例 饿汉式_Java-单例设计模式(懒汉与饿汉)
  7. jQuery的鼠标事件总结
  8. 初始化Metasploit-Framework
  9. 用Excel做一个案例分析
  10. 编码器控制电机正反转梯形图_PLC控制电机正反转以及其它实例
  11. msg1500说明书_瑞斯康达MSG1500 路由 刷机 保姆级教程
  12. 行业承压虎牙营收持续稳健,电竞浪潮中把握长期价值
  13. 电脑安装系统时提示“找不到硬盘”如何解决
  14. 推荐6款UI设计师必备Sketch插件
  15. 关于screenX、clientX、pageX, offsetX的相关介绍
  16. 加速磁盘碎片整理的六大技巧
  17. Tomcat部署及安装
  18. Challenge Growth —— 从这里开始
  19. notepad++分隔符SOH
  20. java 制表符 宽度不够_有没有办法强制使用制表符而不是Java中的空格?

热门文章

  1. php通过smtp 邮箱,php通过SMTP第三方邮箱发送邮件
  2. CAD2009开发笔记(一)
  3. 记录学习Android基础的心得05:常用控件(基础篇)
  4. USMART调试组件
  5. 解决Word中公式与中文文字横向间距的问题
  6. gradle批量配置productFlavors(渠道)
  7. 【Python】报错解决:SyntaxError: Non-ASCII character ‘\xe5‘ in file button.py on line 3, but no encoding
  8. linux下的git本地仓库
  9. 使用evo评测ekf_pose和ndt_pose
  10. 如何用javascript api for arcgis调用有参数的GP服务