当前位置: 首页 > news >正文

一文彻底理解大小端和位域 BIGENDIAN LITTLEENDIAN

一文彻底理解大小端和位域

为什么有大小端

人们一直认为大道至简,就好像物理学上的世界追求使用一个理论来统一所有的现象。为什么cpu存在大小端之分,一言以蔽之,这两种模式各有各的优点,其各自的优点就是对方的缺点,正因为两者彼此不分伯仲,再加上一些硬件厂商的坚持,因此在多字节存储顺序上始终没有一个统一的标准

小端模式优点:

  1. 内存的低地址处存放低字节,所以在强制转换数据时不需要调整字节的内容(注解:比如把int的4字节强制转换成short的2字节时,就直接把int数据存储的前两个字节给short就行,因为其前两个字节刚好就是最低的两个字节,符合转换逻辑);
  2. CPU做数值运算时从内存中依顺序依次从低位到高位取数据进行运算,直到最后刷新最高位的符号位,这样的运算方式会更高效

大端模式优点:

  1. 符号位在所表示的数据的内存的第一个字节中,便于快速判断数据的正负和大小

什么是大小端

高位0x12345678低位
大端模式低地址0x12-0x34-0x56-0x78高地址
小端模式低地址0x78-0x56-0x34-0x12高地址

小端模式:是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。简单的说就是低地址存低位,高地址存高位。大端模式是正好相反。

通过代码来记忆

大多数情况下,小端机器比较多。我们会经常见到如下代码

uint32_t  uiVal = 0x11223344;
uint8_t  *pucLit = (uint8_t *) uiVal;

我们只需要记住 *pucLit的值是 0x44 即可。

字节内的bit顺序也有大小端

在 kernel 中的源码有如下定义

struct tcphdr {__be16	source;__be16	dest;__be32	seq;__be32	ack_seq;
#if defined(__LITTLE_ENDIAN_BITFIELD)__u16	res1:4,doff:4,fin:1,syn:1,rst:1,psh:1,ack:1,urg:1,ece:1,cwr:1;
#elif defined(__BIG_ENDIAN_BITFIELD)__u16	doff:4,res1:4,cwr:1,ece:1,urg:1,ack:1,psh:1,rst:1,syn:1,fin:1;
#else
#error	"Adjust your <asm/byteorder.h> defines"
#endif	__be16	window;__sum16	check;__be16	urg_ptr;
};

在这里插入图片描述
这里可以观察到,在定义struct tcphdr结构体时,使用了宏来区分不同的大小端,里面字节内(8bit)的定义顺序恰好相反。一个字节内res1:4, doff:4,在结构体的定义中位置相反。在小端系统中,res1:4 排在前面,表示字节的低4bit。

可移植性

为了程序的可移植性,不要使用位域的定义方式,请使用位运算来解决问题。Linux 这里是为了效率,牺牲了可移植性。可见效率和可移植性也是鱼和熊掌不可兼得,正如这里的大小端互有优势,不可兼得。

http://www.lryc.cn/news/12819.html

相关文章:

  • 面试准备知识点与总结——(虚拟机篇)
  • spring cloud 集成 seata 分布式事务
  • k8s篇之概念介绍
  • JavaScript学习第1天:浏览器组成、JS的组成、变量、数据类型转化、运算符、while和do...while循环
  • 【Flutter入门到进阶】Dart进阶篇---Dart多线程异步原理
  • WEB系列(二)-----------XSS
  • [python入门㊾] - python异常中的断言
  • 一文告诉你什么是财务数据治理?
  • MySQL数据库调优————ORDER BY语句
  • Linux命令之grep
  • 一起学 pixijs(4):如何绘制文字md
  • mac m1设备上安装Qt并使用qt编程遇到的问题以及解决方式
  • tensorflow 学习笔记(二):神经网络的优化过程
  • 【Java】《Java8 实战》 CompletableFuture 学习
  • Vue3之条件渲染
  • 将Nginx 核心知识点扒了个底朝天(四)
  • 设计模式之工厂模式
  • 80.链表-由来
  • 元胞自动机
  • 设计模式之各种设计模式总结与对比
  • JAVA练习55- Fizz Buzz
  • LeetCode笔记:Biweekly Contest 98
  • HNUCM-《算法分析与设计》期末考试考前复习题
  • 算法导论【分治思想】—大数乘法、矩阵相乘、残缺棋盘
  • Java【七大排序】算法详细图解,一篇文章吃透
  • Autosar OS IOC
  • 记录一次Binder内存相关的问题导致APP被杀的BUG排查过程
  • 设计模式(十)----结构型模式之适配器模式
  • 【数据结构】——队列
  • Android OTA升级常见问题的解决方法