数据的存储--大小端

简介: 数据的存储--大小端

1.什么是大小端

       在平常的调试过程中,尤其是打开内存监视面板的时候,大家是否想过为什么数据会这样存储,就比如下图的整形变量c,我们明明给他的赋值是16进制的11223344,那他为什么在内存中是反着存储(44332211)的呢?

在解决这个问题前,我们需要先理解大小端的概念

      大端:是指大端数据存储模式,简称大端,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中。

       小端:是指小端数据存储模式,简称小端,是指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的低地址中。


2.为什么要有大小端

  为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8 bit。但是在C语言中除了8 bit的char之外,还有16 bit的short型,32 bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。


       例如:一个 16bit 的 short 型 x ,在内存中的地址为 0x0010 , x 的值为 0x1122 ,那么 0x11 为高字节, 0x22 为低字节。对于大端模式,就将 0x11 放在低地址中,即 0x0010 中, 0x22 放在高地址中,即 0x0011 中。小端模式,刚好相反。我们常用的 X86 结构是小端模式,而 KEIL C51 则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。

3.怎么设计程序来判断当前机器的字节序

在百度2015年系统工程师面试题中就有这样一道题:

请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序

在解决这个问题的时候就需要用到我们学的指针解引用相关的知识了,我们知道在对不同的类型解引用的时候,可操作的空间是不一样的,对 int 解引用可以操作4个字节,对 short 解引用的时候可以操作2个字节,对 char 解引用的时候可以操作1个字节

int i = 1;
  //二进制:
  //00000000 00000000 00000000 00000001
  //十六进制:
  //00 00 00 01

我们再观察内存界面

        通过这样的比较,我可以知道,我们使用的VS2022编译器使用的是小端字节序,因为他的01(低位)是处于低地址位的;那如果是大端字节序就应该是00 00 00 01(高位在前,低位在后)。在这样的比较中,我们就可以得出结论,对于定义一个整形变量 i=1 如果他的第一个字节是01那就是低位字节序,如果第一个字节是00,那他就是高位字节序。在有了以上的分析后,我们就可以动手设计代码了。

4.代码实现判断

#include <stdio.h>
int check_sys()
{
  int i = 1;
    //用char解引用不能完整的访问int
    //只能访问第一个字节
    //拿到这个字节后就可以进行判断了
  return (*(char*)&i);
}
int main()
{
  int ret = check_sys();
  if (ret == 1)    //第一个字节为1
  {
    printf("小端\n");
  }
  else            //反之则为大端
  {
    printf("大端\n");
  }
  return 0;
}
目录
相关文章
|
存储
55【计算机基础知识】大端小端存储
【计算机基础知识】大端小端存储
1051 0
|
网络协议 Linux Shell
localhost 和 127.0.0.1 的区别
localhost 和 127.0.0.1 的区别
localhost 和 127.0.0.1 的区别
|
存储 C语言
大端存储和小端存储
1.大小端字节序 2.大端存储 3.小端存储 4.为什么会有大小端存储模式之分? 5.如何判断当前机器是大端存储还是小端存储 方法1 方法2
4314 0
|
NoSQL 算法 Linux
秋招无望,五个C++项目助你上岸(可以写进简历)
秋招无望,五个C++项目助你上岸(可以写进简历)
|
存储 安全 算法
一文理解UDS安全访问服务(0x27)
一文理解UDS安全访问服务(0x27)
一文理解UDS安全访问服务(0x27)
|
存储 缓存 负载均衡
【2022持续更新】大数据最全知识点整理-HBase篇
【2022持续更新】大数据最全知识点整理-HBase篇
1831 0
【2022持续更新】大数据最全知识点整理-HBase篇
|
2月前
|
IDE 搜索推荐 开发工具
Visual Studio 2022 Enterprise 17.14.25 Offline (2026 年 1 月更新)
Microsoft Visual Studio 2022 离线安装包 - 简体中文 | 繁體中文 | English
283 3
Visual Studio 2022 Enterprise 17.14.25 Offline (2026 年 1 月更新)
|
算法
m基于OFDM+QPSK和LDPC编译码以及MMSE信道估计的无线图像传输matlab仿真,输出误码率,并用图片进行测试
MATLAB2022a仿真实现了无线图像传输的算法,包括OFDM、QPSK调制、LDPC编码和MMSE信道估计。OFDM抗频率选择性衰落,QPSK用相位表示二进制,LDPC码用于前向纠错,MMSE估计信道响应。算法流程涉及编码、调制、信道估计、均衡、解码和图像重建。MATLAB代码展示了从串行数据到OFDM信号的生成,经过信道模型、噪声添加,再到接收端的信道估计和解码过程,最终计算误码率。
310 1
|
传感器 存储 程序员
一文彻底搞明白51单片机的发展历程
51单片机自1980年Intel推出MCS-51系列以来,历经40余年发展,从最初的工业控制逐步扩展到家电、通信、智能家居等多领域。其哈佛架构和丰富的指令集奠定了技术基础,并通过持续创新保持竞争力。面对ARM等新架构的挑战,51单片机通过工艺革新和功能扩展,如集成ADC、USB、蓝牙等,仍占据电动工具、智能传感器等成本敏感领域的70%以上市场份额。如今,它不仅是嵌入式技术的活化石,更是中国电子产业崛起的见证者,全球90%的51单片机产自长三角地区。坚持学习,每天一个小知识点,是不是有了新收获,加油哈!
1269 0
|
NoSQL Linux 编译器
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
如何配置环境并使用QEMU虚拟机结合GDB进行Linux内核代码的断点调试,包括安装QEMU、交叉编译工具链,编译内核以及通过GDB远程连接进行调试的详细步骤。
1635 1
内核实验(一):使用QEMU+GDB断点调试Linux内核代码

热门文章

最新文章