数据存储:大端小端

article/2025/9/24 23:07:45

文章目录

  • 问题起源
  • 大端
  • 小端
  • 大端小端优劣
    • 符合人类阅读方式
    • 数据类型转换
    • 符号位的识别
  • 参考资料

曾经辨析和了解过大端小端,但是到了实际应用中还是比较模糊。整理一些资料文章,在此记录。

问题起源

在计算机的使用以及现代很多的嵌入式设备中,我们也通常会用到16bit,32bit和64bit等数据类型。数据都是以一组连续的字节存储的。每一个字节都有一个地址。显然,16bit,32bit和64bit等这些数据将占用多个字节。那当我们说“变量的地址”时,指的是这几个字节中的哪个字节呢?更具体地,如下这段简单地C代码所示,a变量占用4个字节,用取址运算符查看其地址,本机地运行结果是“addr of a = 000000000061FE1C”,返回地地址000000000061FE1C是这4个字节中地哪个呢?

int main(){int a = 123;printf("addr of a = %p",&a);//addr of a = 000000000061FE1Creturn 0;
}

在CSAPP第39页(2.4.1 Adddress and Byte Ordering)中提到:对象地地址就是这些字节地最小地址(with the address of the object given by the smallest address of the bytes used)。(个人理解:对于一个变量,计算机都是从低地址开始读取数据的,所以这也是这个变量的开始地址,但是至于这读到的是什么意思,应该如何解析,就涉及到后面会解释的大端和小端)。也就是说这个变量占用地应该是000000000061FE1C ~ 000000000061FE1F. 可以用以下代码检测,代码参考https://blog.csdn.net/hbsyaaa/article/details/106970226

int main(){int a = 258;unsigned char* ptr1;unsigned char* ptr2;unsigned char* ptr3;unsigned char* ptr4;printf("addr of a = %p\n",&a);//addr of a = 000000000061FE1Cprintf("addr of a = %p\n",&a+1);//addr of a = 000000000061FE00ptr1 = (unsigned char*)&a;   //ptr1 = 61fdfc,*ptr1 = 2ptr2 = (unsigned char*)&a+1; //ptr2 = 61fdfd,*ptr2 = 1ptr3 = (unsigned char*)&a+2; //ptr3 = 61fdfe,*ptr3 = 0ptr4 = (unsigned char*)&a+3; //ptr4 = 61fdff,*ptr4 = 0/* wrong code beginptr1 = (unsigned char*)&a;    //ptr1 = 61fdfc,*ptr1 = 2ptr2 = (unsigned char*)(&a+1);//ptr2 = 61fe00,*ptr2 = 8ptr3 = (unsigned char*)(&a+2);//ptr3 = 61fe04,*ptr3 = 0ptr4 = (unsigned char*)(&a+3);//ptr4 = 61fe08,*ptr4 = 4end of wrong code */printf("ptr1 = %x,*ptr1 = %d\n", ptr1,*ptr1);printf("ptr2 = %x,*ptr2 = %d\n", ptr2,*ptr2);printf("ptr3 = %x,*ptr3 = %d\n", ptr3,*ptr3);printf("ptr4 = %x,*ptr4 = %d\n", ptr4,*ptr4);}

在写这段代码地时候犯了个错误,如以上代码块中“wrong code begin”到”end of wrong code"部分,从而导致结果不是预期地那样。可以发现,与上面四行正确地相比,错的就是对“&a+#”多加了一组括号。这个错误主要是由于自己对运算优先级以及强制类型转换的错误理解。错误地代码中,由于a是一个int,因此对指针进行+1操作时,增加的时4个字节,得到的结果也是一个指针(地址值),但指向的是后面第4个字节,而不是下一个字节;即地址值从0x61fdfc增加到了0x61fe00。新的指针指向地内存空间中的数据时不确定地,因此会打出一些奇怪地数字。正确地做法不用括号。在正确代码中,&运算符优先级最高,先与a运算,之后进行从左往右的运算,即先把&a的结果进行类型转换,强制转换成一个指向unsigned char类型的指针(注意这个*,这是一个指针类型的强制转换,而不是将int转成char,需要的结果是个指针),从而此时再对这个结果,即unsigned char类型指针进行+1操作,就是指向了下一个字节,这样才能得到想要的结果。

通过上面这个试验也可以看出,&a得到的是其4个字节中占有的“4个连续地址”的最小值。

但是这又会带来一个问题:最小地址存放的是这个数的最高字节(most significant byte)还是最低字节(least significant byte)?这里的“最高字节”和“最低字节”指的是一个数的高位和低位。比如一个十进制数123,1是百位,代表的是100,是这个数的最高位;3是个位,表示的就是3,是这个数的最低位。一个二进制数也是一样的,比如一个32位的数“1100 1010 1100 0011 1111 0000 1101 0010”,按照一般人的习惯,从左往右看,最高字节就是“1100 1010”,最低字节就是“1101 0010”。但是计算机不一定这么看。这就涉及到了大端小端的问题。
大端和小端时数据存储的两种不同的形式。不同的CPU、操作系统、甚至应用程序对待数据的存储方式都有所不同。

大端

大端存储方式,即“数值的高位在内存低地址” 。
对于“1100 1010 1100 0011 1111 0000 1101 0010”,大端数据存储方式如下
大端数据存储方式
计算机从低地址开始读/写,所以它先读到/写入的是这个数的最高字节(most significant byte comes first)。

小端

小端存储方式,即“数值的低位在内存低地址” 。
对于“1100 1010 1100 0011 1111 0000 1101 0010”,小端数据存储方式如下
小端数据存储方式
计算机从低地址开始读/写,所以它先读到、写入的是这个数的最低字节(least significant byte comes first)。

大端小端优劣

符合人类阅读方式

通常说“大端更符合人的阅读方式”,主要是出于“人类通常先识别到最高位,再看最低位”的习惯来说的,因为大端存储时,计算机也是“先看到(处理)数值的最高位”。另外,在很多图示中,比如本文中上面两个“大端数据存储方式”和“小端数据存储方式”两幅图,为了表现出“大端符合人类的习惯”,其实在画图时也有一个前提:在表示“地址”的部分也是按照“从左到右,从小的地址到大的地址”来画的。如果反过来话,也就不能说“符合人类阅读习惯”了。

数据类型转换

(本节参考:https://fishc.com.cn/forum.php?mod=viewthread&tid=75394&extra=page%3D1%26filter%3Dtypeid%26typeid%3D571)
对于数值int num = 0x1234,并且还是按照“从左到右,地址由低到高”的惯例:

  • 按照小端存储方式,计算机存储顺序为 0x34120000;如果要将其转换为long,则只需要在它“后面”(高地址处)补0,变成0x34120000 00000000即可。(这里是需要将一个32位的数变成一个64位的数,这多出来的32位往哪儿放、放什么,才能使值不变?显然应该在这个数的高位填充32个0。对于一个按照小端存储方式的数以及人类习惯的阅读书写规则“从左到右,地址由低到高”,它的高位就在它的“右面”,所以书写时,在后面加上0,而在计算机的角度,就是在高地址填充0)
  • 按照大端存储方式,计算机存储顺序为 0x00001234;如果要将其转换为long,由于4是这个数值的最低位,所以还是要把它放在存储区域的最高地址,因此不能直接在后面补0;而且由于类型转换之后,变量的地址不能改变,因此不能再这个数值前面(即当前最低地址之前更低的地址)直接补0,否则按照“对象地地址就是这些字节地最小地址”,这个变量的地址就被改变了。所以要进行相应类型转换,只能通过两个步骤进行:
    (1)先将原来的数向右移动8个字节
    (2)再将这移出来的地方(低地址)用0补齐

符号位的识别

(本节参考:https://fishc.com.cn/forum.php?mod=viewthread&tid=75394&extra=page%3D1%26filter%3Dtypeid%26typeid%3D571)
对于有符号的变量,在其二进制表示中,数值的最高位就是符号位。

  • 如果大端存储方式,由于书写表达时数值时,比较符合大部分人的阅读习惯,最左边的这个数就是符号位,方便人来判断这个数值的正负。
  • 但是如果使用小端存储方式,就不便于人直接判断这个数值的正负了

参考资料

  1. https://fishc.com.cn/forum.php?mod=viewthread&tid=75394&extra=page%3D1%26filter%3Dtypeid%26typeid%3D571
  2. https://blog.csdn.net/hbsyaaa/article/details/106970226
  3. CSAPP

http://chatgpt.dhexx.cn/article/iU0gKT7i.shtml

相关文章

大端与小端

一.大小端介绍 “大端”和“小端”表示多字节值的哪一端存储在该值的起始地址处。小端存储在起始地址处,即是小短字节序;大端存储在起始地址处,即是大端字节序。 大端存储模式:数据的低位保存在内存中的高地址中,数据…

大端和小端的含义及判断代码

1、概述 在计算机系统中,数据都是以字节进行存储的,每个地址单元对应一个字节,每个字节都是8位(bit)。但是C除了char和bool之外,还有其它多字节类型。怎样存储多字节的数据就分为了大端和小端。字节序只和…

C语言基础 —大端和小端

大端和小端 1、什么是大端和小端2、为什么会有大端和小端3、怎样判断是大端还是小端 1、什么是大端和小端 大端模式:就是 高位字节 存放在内存的 低地址端,低位字节 存放在内存的 高地址端 小端模式:就是 低字节存 放在内存的 低地址端&…

大端和小端的区别和判断

1.概念 大端模式(big endian):数据的高位字节保存在内存的低地址中,而低位字节保存在内存的高地址中。 小端模式(little endian):数据的高位字节保存在内存的高地址中,而低位字节保存在内存的低地址中。 问:什么是高…

什么是大端和小端

大端(存储)模式:是指数据的低位保存在内存的高地址中,而数据的高位保存在低地址中; 小端(存储)模式:是指数据的低位保存在内存的低地址中,而数据的高位保存在高地址中。 …

大端、小端的前世今生

什么是大端、小端? BigEndian(大端):低字节在高内存地址 LittleEndian(小端):低字节在低内存地址 所谓大端小端,也就是看低字节在高内存地址还是低内存地址,也就是看低字节在前还是高字节在前,低字节在前…

数据存储:小端模式和大端模式——终于搞明白了!!!

首先要记住:读数据永远是从低地址开始的!!! 正文开始 什么是低地址、高地址? 地址编号小的是低地址,地址编号大的是高地址 什么是数据的低位、高位? 小端模式 数据的低位放在低地址空间&am…

室内定位技术(三)——自有定位技术

我们正在使用的技术是以wifi信号强度正态分布为核心,结合神经网络原理的一套完整算法,并对wifi信号的正态分布情况作了很多的优化工作。 以下是在两组wifi信号强度正态分布研究的实例图: 四条不同颜色的线分别代表不同的ap信号强度的正态分布…

室内定位浅析

这一星期都在弄室内定位的事情,关于室内定位。需求就是两个终端之间,能够快速地通过室内定位做出路线规划,进行导航。 这个精确的室内定位路线规划得益于WIFI的精确部署。 先开看看这个WiFi的理论部署模型。 等边三角形的三个顶点作为三个无…

物联网之室内定位

摘要:室内定位正处于百家争鸣、技术爆发的阶段,尤其近年随着UWB、Wi-Fi以及5G等通信技术的广泛应用。 1、定位需求 物联网时代,位置服务已成为人们工作生活必不可少的服务之一,网约车、外卖、导航等都依赖定位服务。这些最常用的…

室内定位关键技术(indoor location)

一、Wi-Fi定位 Wi-Fi定位是目前相对成熟且应用广泛的定位技术,定位方法是基于信号强度的传播模型法和指纹识别法。信号强度的传播模型法,是指使用当前环境下假设的某种信道衰落模型,根据其数学关系估计终端与已知位置 AP 间的距离&#xff0c…

室内定位——UWB测距及定位原理

关注、星标公众号,直达精彩内容 来源:平行机器人 整理:李肖遥 我们都知道卫星信号在室内会被严重影响,从而导致GPS或是北斗无法定位。所以在室内定位主要采用无线通讯、基站定位、惯导定位等多种技术集成形成一套室内位置定位系统…

【可见光室内定位】(一)概览

目录 一、室内无线定位技术概况二、研究现状三、应用前景背景 一、室内无线定位技术概况 二、研究现状 得益于可见光通信(VLC)技术的迅速发展,可 见光定位(VL&#xff…

室外定位靠卫星 室内定位又如何?

人类为了不让自己迷失在茫茫大自然中,先后发明罗盘、指南针等工具,卫星定位的问世,解决了“我在哪里”的问题。 如今物联网是“信息化”时代的重要发展阶段,随着社会信息化水平的普遍提高,其社会的重要性日益显现。 云…

室内定位之5G定位

目录 一、前言 二、蜂窝网 三、5G引入哪些技术 五、5G室内定位研究现状 六、5G室内CSI指纹定位 七、5G室内定位的未来 一、前言 随着5G通信基础设施逐步完善,5G网络的优势一方面在于其具有的更大的带宽和子载波间隔,使得5G室内定位精度提升(3.5GH…

室内定位——视觉方法的发展

转载自:室内定位——从入门到出家(二,视觉) 作者其他文章: 室内定位——从入门到出家(一) 室内定位——从入门到出家(三,近红外) 室内定位——从入门到出家&a…

室内定位

室内定位调研 1.蓝牙定位 1)背景 蓝牙室内技术是利用在室内安装的若干个蓝牙局域网接入点,把网络维持成基于多用户的基础网络连接模式,并保证蓝牙局域网接入点始终是这个微微网(piconet)的主设备,然后通过测量信号强度对新加入的…

聊聊室内定位技术

目前,定位技术已经非常发达,GPS/北斗等卫星定位、手机基站定位应用都非常广泛。但也都有其局限性,卫星定位只能应用于空旷地方,基站定位只能应用于信号好的地方,且定位精度较低。而室内定位正好弥补了两者的不足。 室内…

室内定位白皮书

3 室内定位技术原理介绍 目前,室内定位技术众多,考虑到市场应用普及性及技术应用前景,本章将从定位原理、定位方式及性能、产业链支持情况以及产业痛点分析这些维度,分析介绍 5G 基站定位、4G 基站定位、蓝牙 4.2定位、蓝牙 5.1 …

室内定位简介

室内定位定义: 室内定位是指在室内环境中实现位置定位,主要采用无线通讯、基站定位、惯导定位等多种技术集成形成一套室内位置定位体系,从而实现人员、物体等在室内空间中的位置监控。 室内定位需求: 在室外环境&#xf…