大小端字节序详解

2023-05-16

目录

引文

大小端介绍

(1)什么是大端小端

(2)为什么有大端和小端

(3)笔试题讲解


引文

    在开始正文之前,我想先问一下大家,内存中是怎样存放一个数的?当然啊,我这里问的不是数据存储的形式(比如整数存原码,负数存补码),而是一个数据存放的顺序

   我们先看下面这个例子,当我们看看当把十六进制函数0x11223344存进内存中会是怎么样的。

   我们看这个数低位44,高位33,再高位22,再高位11(注意44 、33、22、11各占一个字节,44地址0x0078F20,33地址...21,22地址...22,11地址...23),而我们看到这个数在内存中是倒着放的。为什么呢?接下来我讲引入大小端概念,为大家解答。

大小端介绍

(1)什么是大端小端

        大小端全称大小端字节序存储,分为大端字节序存储和小端字节序存储。为什么叫字节序呢?就是以字节为单元来排它的循序

在学习大小端存储之前,我们必须了解几个概念,

(1)我们要知道一个十六进制位能转换4个二进制位,那两个十六进制位就能转换8个二进制位,也就是一个字节(11 、 22 、 33 、44)。

(2)其中44是a中最低位的一个数据,11是a中最高位的一个数据

在内存中,a有两种存储方式。

        当我们把低位字节处的数据(44)放到高地址置处,把高位字节处的数据(11)放到低地址处,这种存储方式就是大端存储反之就是小端存储

如下图所示

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

(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)笔试题讲解

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

这是2015百度系统工程师笔试题,第一问咱们已经所过了,忘记的小伙伴可以回去再看一遍。

第二问我们可以用C语言来判断机器的大小端字节序。

    首先我们知道一个数在内存中存储是第一个字节的数不相同,所以我们只需要判断内存中第一个字节就能判断大小端字节序

    我们先定义一个变量并赋值为1(1比较容易判断),1的十六进制位0x00000001,所以我们能判断00为大端字节处数据,01为小端字节处数据

如下在内存中的两种存储方式,如果我们那第一个字节是0那就是大端,如果是1那就是小端。

 问题已经分析完了,接下来就该实现代码了。但是我们如果在四个字节里面取一个字节呢?

不知道大家了解char*字符型指针吗,char*指针解引用访问一个字节,我们可以借此把a的地址强制转换成char*保存在一个char*指针,解引用指针就能取出第一个字节了。

代码实现如下:

#include<stdio.h>
int main()
{
	int a = 1;
	//000000000000000000000001
	//0x 00 00 00 01

	char* p = (char*)&a;

	if (*p == 1)
	{
		printf("小端\n");
	}
	else {
		printf("大端\n");
	}

	return 0;
}

 到此本题结果就出来了。但是对我们来说得出结果还没有结束,我们需要等优等的代码。

首先这个代码是一次性的呀,如果别人想用的话就用不了了,所以我们可以把大小端判断代码封装成一个函数,这样别只要调用函数就能知道电脑是大端还是小端了。

同时我们最后不要在函数内打印,因为我们也不知道别人是否要打印结果,所以我们可以返回1代表是小端,返回0代表是大端。

int check_sys()
{
	int a = 1;
	char* p = (char*)&a;
	if (*p == 1)
	{
		return 1;//小端
	}
	else {
		return 0;//大端
	}
}

 到这有人可能发现了,这个代码还可以再简化一下。我们看*p,如果*p为1就返回1,那我们何不就返回*p呢,而*p是从那个地方获取的值呢?是*(char*)&a

所以我们直接return *(char*)&a

int check_sys()
{
	int a = 1;
	return *(char*)&a;
	
}

到此代码优化就完毕了。

以上就是大小端字节序的讲解,有错误的地方希望大家能批评指正,别忘了点赞👍+收藏⭐️哦 

      😜  关注我!带来等多精彩🎉🎉

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

大小端字节序详解 的相关文章

随机推荐

  • HART协议数据格式避坑(C语言压缩字符串Packed-ASCII和ASCII转换)

    HART协议数据格式避坑 xff08 C语言压缩字符串Packed ASCII和ASCII转换 xff09 首先HART数据格式如下 xff1a 重点就是浮点数和字符串类型 Latin 1就不说了 基本用不到 浮点数 浮点数里面 如 0x4
  • 【GUI】基于Python的文本数据处理(串口解析 0D 0A结尾)

    GUI 基于Python的文本数据处理 xff08 串口解析 0D 0A结尾 xff09 如有串口数据 xff1a span class token punctuation span span class token number 37 s
  • ssh指定登陆用户

    指定登陆用户 默认的 xff0c ssh 会尝试用当前用户作为用户名来连接 在上面的示例命令中 xff0c ssh 会尝试用用户名叫 pungki 的用户身份来登入服务器 xff0c 这是因为用户 pungki 正在客户机上使用 ssh 客
  • 【Python文本处理】基于GPX文件的心率、速度、时间等参数更改

    Python文本处理 基于GPX文件的心率 速度 时间等参数更改 GPX文件本身其实就是坐标 海拔 时间 心率等综合性的xml文件 如图 xff1a 海拔 xff1a ele 时间 xff1a time 心率 xff1a heartrate
  • ubuntu学习笔记

    64 ubuntu学习笔记 记录一些经常用到的软件或在环境的配置 1 安装18 04ubuntu 2 安装ROS 安装方法 xff1a ROS安装 3 安装VScode VScode安装 4 安装PCL ubuntu安装pcl1 8 1 下
  • pointSIFT报错:找不到 -ltensorflow_framework

    本人环境 xff1a ubuntu18 04 tensorflow 2 1 在复现pointSIFT的时候 xff0c 按照readme提示 xff0c 修改 sh文件中tensorflow和lib的位置 xff0c 编译 sh文件时报错
  • 51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

    目录 1 串口通信原理 2 51单片机串口通信 2 1 串口简要模式图 2 2 相关寄存器 xff08 1 xff09 PCON SCON SBUF xff08 2 xff09 IE IPH IP xff08 3 xff09 配置T1定时器
  • 数据库左连接和右连接有什么区别!

    大家好我是艺霏 xff0c 今天和大家谈一下数据库左连接和右连接有什么区别 xff1f 数据库中的左连接和右连接的区别可以概括为一句话来表示即左连接where只影响右表 xff0c 右连接where只影响到左表 image png 在这里推
  • 集成测试详解,看完必须懂了

    什么是集成测试 集成测试 xff08 Integration Testing xff09 xff0c 也叫组装测试或联合测试 在单元测试的基础上 xff0c 将所有模块按照设计要求 xff08 如根据结构图 xff09 组装成为子系统或系统
  • 2023软件测试工程师面试题汇总-看完你离大厂不远了

    都说知己知彼方能百战不殆 xff0c 转眼间2023年已经来到 xff0c 现在已经是一月中旬了 xff0c 每年的3 4月都是找工作的好时机 xff0c 我们又经常叫他们金三银四 今天就给大家汇总了很多关于测试的面试题 xff0c 希望能
  • 面试了8家软件公司测试岗位,面试题大盘点,我真的尽力了。

    项目的测试流程 拿到需求文档后 xff0c 写测试用例 审核测试用例 等待开发包 部署测试环境 冒烟测试 xff08 网页架构图 xff09 页面初始化测试 xff08 查看数据库中的数据内容和页面展示的内容是否一致 xff0c 并且是否按
  • 2021年最强软件测试工程师Linux面试题及答案

    前言 xff1a 大家好 xff0c 我是一菲 xff0c 前段时间有很多朋友给我私信留言 xff1a 在面试软件测试工作时 xff0c 部分的liunx的问题答不上来 xff0c 于是一菲快马加鞭 xff0c 连夜给大家整理了一份关于li
  • iOS APP测试方法和测试工具 大揭秘

    随着移动互联网的发展 xff0c 以及智能手机的普及 xff0c 各种各样的 APP 层出不穷 xff0c 大家可以数一数自己手机上安装的 APP xff0c 随随便便几十个 xff0c 上百个 xff0c 所以现在 APP 测试的需求也越
  • oracle sql loader命令与ctl写法

    xfeff xfeff sql loader 的特点 oracle自己带了很多的工具可以用来进行数据的迁移 备份和恢复等工作 但是每个工具都有自己的特点 比如说exp和imp可以对数据库中的数据进行导出和导出的工作 xff0c 是一种很好的
  • 史上最全的字符串格式化方法,学这些就够用了

    一 思考 1 什么是字符串格式化 将变量 xff08 对象 xff09 的值填充到字符串中 在字符串中解析Python表达式 对字符串进行格式化显示 左对齐 右对齐 居中对齐保留数字有效位数 2 你学过的字符串格式化方式有哪些 字符串格式化
  • Linux实现黑客帝国效果,超级简单

    MATRIX是Linux的环境下黑客帝国风格的屏保 xff0c 绿色的字母在屏幕上刷刷如雨水落下 xff0c 偶尔看看能回忆起程序猿的黑客梦 首先要在网上找到CMATRIX安装包 xff0c 然后安装 xff0c 需要的话找柠檬班小米 xf
  • 10年互联网职场过来人给测试专业大学生的学习建议

    改进学习方法 xff0c 就如改进你的测试方法一样 不管你面临的是什么环境和挑战 xff0c 值得期许的 就值得去尝试 1 关于学习 在学校期间以专业课为主 xff0c 专业理论知识越扎实 xff0c 后期实践才越容易深入理解且上手更快 对
  • 使用 GitHub Copilot 自动化测试

    代码完成并不是什么新鲜事 像 IntelliSense 这样的工具已经允许开发人员通过尝试自动完成他们正在编写的函数或语句的名称来提高工作效率 xff0c 但是可用的工具只有一定程度的实际 智能 可用 随着 GitHub 的 Copilot
  • 想让你的接口自动化测试更加有效? 这个统计方法必须掌握

    覆盖率概念 接口自动化测试是现代软件开发中不可或缺的一环 xff0c 它能够帮助开发团队自动化执行测试用例 xff0c 以快速而准确地发现并修复软件缺陷 而覆盖率统计则是在测试执行完成后 xff0c 帮助测试团队了解哪些代码路径被覆盖了 x
  • 大小端字节序详解

    目录 引文 大小端介绍 xff08 1 xff09 什么是大端小端 xff08 2 xff09 为什么有大端和小端 xff08 3 xff09 笔试题讲解 引文 在开始正文之前 xff0c 我想先问一下大家 xff0c 内存中是怎样存放一个