什么是大小端?如何确定大小端?

2023-10-27

一、什么是大小端?

对于一个由2个字节组成的16位整数,在内存中存储这两个字节有两种方法:一种是将低序字节存储在起始地址,这称为小端(little-endian)字节序;另一种方法是将高序字节存储在起始地址,这称为大端(big-endian)字节序。

假如现有一32位int型数0x12345678,那么其MSB(Most Significant Byte,最高有效字节)为0x12,其LSB (Least Significant Byte,最低有效字节)为0x78,在CPU内存中有两种存放方式:(假设从地址0x4000开始存放)

总结:

大端是高字节存放到内存的低地址

小端是高字节存放到内存的高地址

二、如何确定大小端

有些CPU公司用大端(譬如C51单片机);有些CPU用小端(譬如ARM)。(大部分是用小端模式,大端模式的不算多)。于是乎我们写代码时,当不知道当前环境是用大端模式还是小端模式时就需要用代码来检测当前系统的大小端。下面给出用程序判断大小端的两种方法:

#include <stdio.h>

// 共用体中很重要的一点:a和b都是从u1的低地址开始存放的。
// 假设u1所在的4字节地址分别是:0、1、2、3的话,那么a自然就是0、1、2、3;
// b所在的地址是0而不是3.

union myunion
{
	int a;
	char b;
};

// 如果是小端模式则返回1,小端模式则返回0
int is_little_endian(void)
{
	union myunion u1;
	u1.a = 0x12345678;				// 地址0的那个字节内是0x78(小端)或者0x12(大端)
    if(0x78 == u1.b)
        return 1;
    else if(0x12 == u1.b)
	    return 0;
}

int is_little_endian2(void)
{
	int a = 0x12345678;
	char b = *((char *)(&a));		// 指针方式其实就是共用体的本质
	if(0x78 == b)
        return 1;
    else if(0x12 == b)
	    return 0;
}


int main(void)
{
	int i = is_little_endian2();
	//int i = is_little_endian();
	if (i == 1)
	{
		printf("小端模式\n");
	}
	else
	{
		printf("大端模式\n");
	}
	
	return 0;
}

下面给出三种确定大小端错误的方案

	// 强制类型转换
int a;
char b;
a = 1;
b = (char)a;
printf("b = %d.\n", b);
	// 移位
int a, b;
a = 1;
b = a >> 1;
printf("b = %d.\n", b);
	// 位与
int a = 1;
int b = a & 0xff;		// 也可以写成:char b = a & 0x01;
printf("b = %d.\n", b);

位与、移位、强制类型转换等运算是编译器提供的运算,这个运算是高于内存层次的(或者说这些运算在二进制层次具有可移植性,也就是说&的时候一定是高字节&高字节,低字节&低字节,和二进制存储无关)。

 

REF:

朱有鹏课堂笔记

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

什么是大小端?如何确定大小端? 的相关文章

  • 笔记-STM32F407 DAC-DMA-TIM输出正弦波

    通用定时器6中断初始化 arr 自动重装值 psc 时钟预分频数 定时器溢出时间计算方法 Tout arr 1 psc 1 Ft us Ft 定时器工作频率 单位 Mhz 这里使用的是定时器6 void TIM6 Init u16 arr
  • # PIC32MK1024GPE100-串口BootLoader ## 传统BootLoader(不带BANK切换)

    下面开始具体操作 稍微带一点理论 研究不深 编译环境 mplab x ide v5 5 mhc harmoney v3 0 第一步 创建BootLoader工程 创建工程 如图1 这里不展开讲 只讲注意点 注意 1 配置好板子上对应引脚 如
  • 【STM32+cubemx】0024 HAL库开发:IAP(在应用编程)的实现

    IAP在应用编程 In Application Programming 指的是MCU在运行应用程序时 能接收新的烧写文件 并更新到自身的程序存储器中 即可以在应用程序运行时在线升级 本节我们通过一个简单的例子 来实现STM32的IAP功能
  • STM32 基础系列教程 18 – IWDG

    前言 学习stm32 独立看门狗 IWDG 接口使用 学会用STM32内部独立看门狗 IWDG 实现程序异常时自复位功能 STM32F10xxx内置两个看门狗 提供了更高的安全性 时间的精确性和使用的灵活性 两个看门狗设备 独立看门狗和窗口
  • STM32 基础系列教程 38 - Lwip_http

    前言 HTTP协议 HyperText Transfer Protocol 超文本传输协议 是因特网上应用最为广泛的种网络传输协议 所有的WWW文件都必须遵守这个标准 HTTP是一个基于TCP IP通信协议来传递数据 HTML 文件 图片文
  • 关于串口助手接收到数据,但显示的数据(16进制)为00的解决方法

    只需要把波特率调低就行
  • 《深入理解计算机系统》(CSAPP)实验三 —— Buf Lab

    这是CSAPP的第三个实验 主要让我们熟悉GDB的使用 理解程序栈帧的结构和缓冲区溢出的原理 实验目的 本实验的目的在于加深对IA 32函数调用规则和栈结构的具体理解 实验的主要内容是对一个可执行程序 bufbomb 实施一系列缓冲区溢出攻
  • 汇编基础知识

    一 汇编语法 1 GNU 汇编语法适用于所有的架构 并不是 ARM 独享的 GNU 汇编由一系列的语句组成 每行一条语句 每条语句有三个可选部分 如下 label instruction comment label 即标号 表示地址位置 有
  • STM32F103C8T6在线升级 IAP

    stm32程序每次执行都会从基地址0x800 0000开始执行 IAP程序升级的执行是在bootloader引导文件执行后 进行加载 跳转APP程序 所以每次上电后进入BootLoader判断是否需要升级 如果升级则接受bin文件 如果不升
  • STM32 基础系列教程 21 - NVIC

    前言 学习stm32 NVIC接口编程 学会使用常用的NVIC接口函数 优改中关优先级 开 关单个中断 开 关所有中断 开 关所有中断和异常 系统软件重启等功能 示例详解 基于硬件平台 STM32F10C8T6最小系统板 MCU 的型号是
  • STM32 基础系列教程 33 - Lwip_tcp_client

    前言 学习stm32 以太网接口使用 及LWIP使用 用LWIP快速实现一个TCP client网络通信功能 学会基本LWIP的网络数据接收与发送功能 让初学者了解lwip 关于Lwip更多的功能介绍将会在后期的STM32 中级教程中介绍
  • 基于stm32f107 stm32cube 和 LWIP 协议实现 udp 组播通信

    最近在做一个基于stm32f107 实现 UDP 组播通信的项目 项目基于 stm32cube 配置生成 如下图 UDP组播头文件 ifndef MULTICAST H define MULTICAST H include lwip udp
  • STM32 基础系列教程 31 – DAC

    前言 学习stm32 DAC数模转换接口使用 学会用STM32 的DAC接口 通过DAC接口将数字信号转变成模拟信号输出 或查看内部变量值的变化波形 学习DAC波形发生器的使用 示例详解 基于硬件平台 NUCLEO F302R8 NUCLE
  • 线性回归方程

    线性回归方程在嵌入式开发中是非常常用的 尤其在参数校准这块应用非常普遍 无论你是写在上位机代码中 还是直接写在嵌入式软件中 下面是我在PT100校准中写的关于线性回归方程代码 线性回归方程公式 平均值XA X1 X2 XN N 平均值YA
  • STM32 基础系列教程 5 – 系统定时器

    前言 学习stm32 systime的使用 用基本定时器产生定时1ms定时中断 用于参生1ms系统时钟节拍 并实现将1ms 节拍改成500us 或其它时间功能 并实产生的时间节拍为机基准实现控制LED闪烁 示例详解 基于硬件平台 STM32
  • 基于MCU,如何零代码无开发实现OTA差分升级?

    概述 随着物联网设备智能化的发展 OTA 升级已经成为了业界公认的基础能力 而 OTA 在设计和实现过程中需要依赖于物联网设备的硬件方案 物联网设备主流的硬件方案为 1 直接基于通讯芯片 模块开发的方案 用户升级的主要目标是通讯芯片 模块
  • 嵌入式软件国际化(多语言) 点阵字库选择分析

    概述 嵌入式软件国际化 多语言 点阵字库选择分析 多字节字符集与unicode 多字节编码最大的问题在于每一个语种的字符集编码不兼容 unicode的好处在于将所有人类语种字符都有了统一的编码 现在世界上语言基本都包含在了基本多文种平面0上
  • Beyond Compare 3 许可证密钥被撤销

    最近在使用 Beyond Compare 3 时突然出现 许可证密钥被撤销 问题 现象截图以下 自己清除注册表并重新安装后还是出现相同的问题 没办法只能求助于百度 找到解决方法 删除 C Users Administrator AppDat
  • SEGGER_RTT_printf()函数实现打印浮点、负数-示例

    概述 最近公司项目换另一款gsensor 用到了浮点数打印 又不想使用串口来打印数据 在此做个笔录 通过修改源码方式实现 一 修改源码 1 在 SEGGER RTT printf c 中 的 int SEGGER RTT vprintf u
  • 在WINDOW 系统下如何用批处理命令生成代码

    如图要实现一个每次编译都会自动重新生成的代码 一般是 软件版本相关的代码最适合这种自动生成 上图中需在用到编译时间和日期 来直接上代码 BEGIN COLOR 07 cls echo off ECHO ECHO 自动生成软件版本号 ECHO

随机推荐

  • 欠拟合和过拟合

    过拟合 定义 具体表现就是最终模型在训练集上效果好 在测试集上效果差 模型泛化能力弱 具体表现就是最终模型在训练集上效果好 在测试集上效果差 模型过于复杂 过拟合的原因 训练数据中噪音干扰过大 使得学习器认为部分噪音是特征从而扰乱学习规则
  • Nginx二级项目配置

    Nginx二级项目服务页面部署 应用场景 比如一个项目需要一个正常的生产服务的地址在根目录 现在需要一个后台管理项目可以部署在 admin 的路径下 需要帮助文档的页面可以部署在 help nginx conf 配置 location ma
  • 【SQL注入-08】二次注入案例—以sqli-labs-less24为例

    目录 1 二次注入概述 1 1 定义 1 2 思路 2 二次注入案例 2 1 实验平台 2 2 实验目标 2 3 具体注入过程 2 3 1 注入前准备 2 3 2 确定目标账户admin 2 3 3 第一次注入 2 3 4 第二次注入 2
  • eos bp节点 超级节点搭建

    https github com nebulaprotocol 这个网址里面有一个 fake terminal website 比较有意思 可以看看示例 https bp nebulaprotocol com 搭建eos BP节点 环境搭建
  • 家政服务小程序制作攻略揭秘

    想要打造一个家政服务小程序 但是又不懂编程和设计 不用担心 下面将为你详细介绍如何利用第三方平台 从零开始打造一个家政服务小程序 首先 你需要找到一个适合的第三方平台 例如乔拓云网 在乔拓云网的 轻应用小程序 中 点击 去管理 你就可以进入
  • 回顾2021,展望2022

    2021 这一年最大的收获是孕育了一个聪明漂亮机灵的小家伙 这一年我虚岁28岁 和爱的人有了爱的结晶 东哥各方面都挺好的 我们都不是圣人 都是能力有限的普通人 但他在尽其所能的对我好 我不是万能的人 但也独立坚强 之后一个人带娃的日子适应的
  • LaTeX公式中指定某些字母或符号为正体

    m rm G 显示效果为
  • I/O 函数/缓存和字节流、占位符、getchar(),putchar()

    I O 函数 C 语言提供了一些函数 用于与外部设备通信 称为输入输出函数 简称 I O 函数 输入 import 指的是获取外部数据 输出 export 指的是向外部传递数据 缓存和字节流 严格地说 输入输出函数并不是直接与外部设备通信
  • 从零开始学C++之异常(三):异常与继承、异常与指针、异常规格说明

    一 异常与继承 如果异常类型为C 的类 并且该类有其基类 则应该将派生类的错误处理程序放在前面 基类的错误处理程序放在后面 include
  • python3.5源码分析-启动与虚拟机

    Python3源码分析 本文环境python3 5 2 参考书籍 lt
  • 虚幻引擎游戏开发过程中,游戏鼠标如何双击判定?

    UE虚幻引擎对于游戏开发者来说都不陌生 市面上有47 主机游戏使用虚幻引擎开发游戏 作为是一款游戏的核心动力 它的功能十分完善 囊括了场景制作 灯光渲染 动作镜头 粒子特效 材质蓝图等 本文介绍了虚幻引擎游戏开发过程中游戏鼠标双击判定 一起
  • 数据库变更管理:Liquibase or Flyway

    从零打造项目 系列文章 工具 比MyBatis Generator更强大的代码生成器 ORM框架选型 SpringBoot项目基础设施搭建 SpringBoot集成Mybatis项目实操 SpringBoot集成MybatisPlus项目实
  • vsftpd默认值

    原文地址 http vsftpd beasts org vsftpd conf html 国内解释 http hi baidu com 346430756 blog item 5527e9363402652a0b55a9d0 html VS
  • Leetcode链表篇总结(C++)

    文章目录 一 基础知识 二 经典题目 1 203 移除链表元素 简单 2 707 设计链表 中等 3 206 反转链表 简单 4 142 环形链表 中等 5 19 删除链表的倒数第N个结点 中等 6 面试题 02 07 链表相交 简单 三
  • Java实现添加文字水印、图片水印功能实战

    本文介绍java实现在图片上加文字水印的方法 水印可以是图片或者文字 操作方便 java实现给图片添加水印实现步骤 获取原图片对象信息 本地图片或网络图片 添加水印 设置水印颜色 字体 坐标等 处理输出目标图片 一 java实现给图片添加文
  • 目标检测的数据格式

    在目标检测任务中 常见的数据集格式有三种 分别为voc coco yolo 一 VOC voc数据集由五个部分构成 JPEGImages Annotations ImageSets SegmentationClass以及Segmentati
  • lua元表的相关知识

    setmetatable 和getmetatable local a 8 local b s local t 1 2 在Lua代码中 只能设置table的元表 若要设置其它类型的值得元表 则必须通过C代码来完成 对于字符串 标准的字符串程序
  • Linux中apt命令

    apt简介 Advanced Packaging Tool apt 是Linux下的一款安装包管理工具 最初只有 tar gz的打包文件 用户必须编译每个他想在GNU Linux上运行的软件 用户们普遍认为系统很有必要提供一种方法来管理这些
  • Github的创建及使用

    Github创建 注册账号 进入GitHub官网 https github com 步骤1 注册账号 username 不能使用下划线 并且短横线不能打头 中文也是不合法昵称 email 要填写合法邮箱 并且是未在GitHub注册过的邮箱
  • 什么是大小端?如何确定大小端?

    一 什么是大小端 对于一个由2个字节组成的16位整数 在内存中存储这两个字节有两种方法 一种是将低序字节存储在起始地址 这称为小端 little endian 字节序 另一种方法是将高序字节存储在起始地址 这称为大端 big endian