文章目录

  • 大小端模式的概念
  • 两种模式出现原因
  • 两种模式的优劣
  • 大小端的应用情景
  • 判断机器的字节序

大小端模式的概念

当我们查看数据在内存中的存储情况时,我们经常会发现一个很奇怪的现象,什么现象呢?

int main()
{int i = 12;return 0;
}


数据在内存中的存放方式似乎和我们想象的顺序不太一样,在我们的常规认知不一样,在我们的常规认知中,它的存放方式应该是 00 00 00 0c ,那造成这个现象的原因是什么呢?

这是因为在内存中存放数据通常会采用两种不同的存储模式:大端存储和小端存储。

  • 大端存储模式:是指 数据的位 保存在 内存的地址 中,数据的位 保存在 内存的地址 中。
    这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。

  • 小端存储模式:是指 数据的位 保存在 内存的地址 中, 数据的位 保存在 内存的地址 中。
    这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。

用图举例:

用表举例:
32bit宽的数 0x12345678 在CPU内存中的存放方式(假设从地址 0x4000 开始存放)为:

数据高位  ->   数据低位0x12345678
内存地址 小端模式 大端模式
高地址 0x4003 0x12 0x78
0x4002 0x34 0x56
0x4001 0x56 0x34
低地址 0x4000 0x78 0x12

两种模式出现原因

为什么会有大小端模式之分呢? 这是因为:

  • 有些变量类型的大小大于一个字节,如:16bit的short型,32bit的long型(要看具体的编译器)。
  • 有些处理器的位数大于8位,例如16位或者32位的处理器。那么其中的寄存器的宽度必定大于一个字节。

总而言之,就是一个字节无法满足我们的存储需求,因此就诞生了大端小端这两种存储模式。


两种模式的优劣

大端小端没有谁优谁劣,各自优势便是对方劣势:

  • 小端模式 :
  1. 强制转换数据不需要调整字节内容,1、2、4字节的存储方式一样。
  2. CPU做数值运算时从内存中依次从低位到高位取数据进行运算,直到最后刷新高位的符号位,这样的运算方式会更高效。
  • 大端模式 :符号位的判定固定为第一个字节,容易判断正负。

大小端的应用情景

一般操作系统都是小端,而JAVA、通讯协议是大端的。

对于处理器而言:

  • 小端模式:Intel的80X86系列芯片,ARM处理器默认采用小端、但可以切换成大端。
  • 大端模式:KEIL C51、PowerPC、IBM、Sun。

判断机器的字节序

那么我们该如何判断当前机器的字节序是大端还是小端?

int 变量 i=258 为例,i 的16进制形式为 i=0102 ,用图来表示 i 以两种方式存储的结果:

小端存储模式最低位字节 存放的为 02大端存储模式 中放的为 00 。因此可以通过强制转换的方法,将一个四个字节的 int 数据截断为一个字节的 char 数据,即可得到这个低位的数据,再进行判断,如果为 02 则说明该机器为 小端存储模式,如果为 00 则说明为 大端存储模式

代码实现:

int main()
{int i = 258;char ch = (char)i;if (ch == 02)printf("小端存储\n");elseprintf("大端存储\n");return 0;
}

运行结果:

验证:

大端小端存储模式详解及判断方法相关推荐

  1. 大端小端存储方式详解

    大端方式:用存储器的低字节地址单元来存放数据的最高字节 小端存放:用存储器的低字节地址单元来存放数据的最低字节 注: 在存储器中,左边的字节地址单元低于右边的字节地址单元,字节地址单元一般由八位二进制 ...

  2. IoT:大端与小端字节数据详解

    大端与小端字节数据详解 转自:https://blog.csdn.net/dosthing/article/details/80641173 前言 计算机的数据以01构成的字节存储,这就涉及数据大小端 ...

  3. 大端和小端存储模式解析

    一.大端模式和小端模式的起源 关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的<格利佛游记>:Lilliput和Blefuscu这两个强国在过去的36个月中一 ...

  4. C语言中低位存放,C语言 大端小端存储解析以及判断方法

    当我们在C语言中查看数据在内存中的存储时,我们经常会发现一个很奇怪的现象,什么现象呢? 例如下面这段代码 int main() { int i = 1; return 0; } 数据在内存中的存放方式 ...

  5. C语言程序设计 | 大端小端存储解析以及判断方法

    当我们在C语言中查看数据在内存中的存储时,我们经常会发现一个很奇怪的现象,什么现象呢? 例如下面这段代码 int main() {int i = 1;return 0; } 数据在内存中的存放方式似乎 ...

  6. 大小端存储模式的理解和判断

    在计算机系统中,存储是以字节为单位的,每个地址单元都对应着一个字节,一个字节=8bit.在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器). ...

  7. 小端模式和大端模式_计算机字节顺序(大端法和小端法)详解

    首先理清一下基本的概念: 1. 大多数机器使用时的8位的块(一个字节),作为可寻址的最小单位, 2. 机器级程序将内存视为非常大的字节数组(虚拟内存),内存的每个字节都由一个唯一的数字来表示(如下X的 ...

  8. 大端与小端字节数据详解

    前言 计算机的数据以01构成的字节存储,这就涉及数据大小端的问题.计算机是大端数据模式还是小端数据模式对于普通的应用程序没有什么影响,但是在诸如网络编程.芯片寄存器操作的时候就有必要区分一下了,要不然 ...

  9. 大端小端存储方式以及区别方法

    一.大端.小端存储区别 大端存储:低字节放在高地址,高字节放在低地址. 小端存储:高字节放在高地址,低字节放在低地址. 数据0X12345678在0X20000000地址上的存储方式: 地址 小端 大 ...

最新文章

  1. Power Law and Exponential Decay of Inter Contac...
  2. Exchange2007 申请安装证书
  3. hibernate防止sql语句注入
  4. java学习(67):匿名内部类
  5. python实现简单爬虫抓取图片
  6. linux防火墙服务关闭,Linux防火墙(firewall)的开启与关闭
  7. php 目录文件大小,利用php怎么对目录文件的大小进行统计
  8. Exchange服务器系列课程之二--Exchange Server 2003多服务器安装以及管理工具介绍
  9. Linux中命令选项及参数简介
  10. 极酷WIFI深度剖析免费WIFI
  11. 图书管理系统E-R图转关系图
  12. VS2010使用c++、gSOAP调用WebService 图文教程
  13. Gitlab项目上传
  14. 支付宝微信刷脸支付开始在全国推广
  15. android bitmap nv21,Nv21转Bitmap(高效率转化)
  16. 服务器安装360文档卫士,360文档卫士官方版_360文档卫士详细使用方法
  17. SQL注入漏洞入门介绍
  18. 天融信java面试_天融信面试准备
  19. 查看loam的三维点云地图
  20. Python(1)--代码书写规范和注释

热门文章

  1. Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
  2. 一款惊艳的Android脱壳工具
  3. 模仿360安全卫士项目笔记7
  4. 注意,2022JCR分区有变,364本期刊影响因子更正
  5. 车联网T-BOX小结
  6. Tbox 相关名词总结
  7. 边缘计算需要java_一分钟快速了解边缘计算
  8. cucumber的hooks
  9. 转:我,一个写代码的
  10. selenium之用chrome的Mobile emulation模拟手机浏览器测试手机网页