大端和小端字节序

C语言中的大端字节序和小端字节序是什么?如何进行字节序的转换? 理解大端字节序和小端字节序的原理以及如何进行字节序的转换,是C语言程序员必备的基础知识之一。在计算机中,存储器是以字节为单位进行访问的,而在多字节的数据类型(如整数、浮点数)的存储过程中,涉及到字节的顺序问题,即字节序。大端字节序和小端字节序是两种常见的字节序,它们决定了多字节数据在内存中的存储方式。为了解决这个问题,常常需要进行字节序的转换。相反,小端字节序中,数据的低字节存储在低地址,而数据的高字节存储在高地址。在进行字节序转换时,可以使用调试工具观察数据在内存中的存储顺序,确保转换的正确性。 阅读详情

 大端和小端字节序的问题在网络中以及在不同的操作系统的兼容性中是一个比较大的问题。它关系到不同操作系统和网络传输是否能够保证数据的语义正确性。


    对于一个字节而言,大端和小端没有任何的区别,但是对于多个字节而言,就存在着显著的区别。这个区别我们可以很容易想到,如果提供了一个地址,比如0x37041200,需要读取这个地址的一个字,也就是4个字节的一个数据。那么是读取从0x37041200开始到0x37041300这样的一个数,还是读取从0x37041200开始到0x37041100存储的4个字节的数。为此就出现了不同公司的两种实现--一个就是大端,一个就是小端。


你也可以用下面的程序测验你的机器是大端字节序还是小端字节序:
----------------------------------------------------------
#include <stdio.h>
int IsLittleEndian()
{
unsigned int usData = 0x12345678;
unsigned char *pucData = (unsigned char*)&usData;
if(*pucData == 0x78)
     return 1;
else
     return 0;
}

int main(void)
{
    if(IsLittleEndian())
        printf("is little endian!\n");
    else
        printf("is big endian!\n");
    return 0;
}

我的机器是Intel的X86系列,所以是little endian.


a=0x12345678
----------------------------------------------------------
"Little Endian" means that the low-order byte of the number is stored in memory at the lowest address, and the high-order byte at the highest address. (The little end comes first.) For example, a 4 byte LongInt 

    Byte3 Byte2 Byte1 Byte0

will be arranged in memory as follows: 
    Base Address+0   Byte0     78h    
    Base Address+1   Byte1     56h
    Base Address+2   Byte2     34h
    Base Address+3   Byte3     12h

Intel processors (those used in PC's) use "Little Endian" byte order.


"Big Endian" means that the high-order byte of the number is stored in memory at the lowest address, and the low-order byte at the highest address. (The big end comes first.) Our LongInt, would then be stored as: 

    Base Address+0   Byte3    12h
    Base Address+1   Byte2      34h
    Base Address+2   Byte1      56h
    Base Address+3   Byte0      78h

Motorola processors (those used in Mac's) use "Big Endian" byte order 




a=0x12345678
----------------------------------------------------------
Little-Endian: Base Address decrease(递减)
                 Little-Endian
         |-----------|<--- Base Address
         |    78     |
         |-----------|
         |    56     |
         |-----------|
         |    34     |
         |-----------|
         |    12     |
         |-----------|



         |-----------|
         |    78     |
         |-----------|
         |    56     |
         |-----------|
         |    34     |
         |-----------|
         |    12     |
         |-----------|<--- Base Address
                Big-Endian
Big-Endian: Base Address increase(递增)

大端模式和小端模式的区别

嵌入式系统开发者应该对Little-endian和Big-endian模式非常了解。例如,16bit宽的数0x1234在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:

内存地址

0x4000

0x4001

存放内容

0x34

0x12

而在Big-endian模式CPU内存中的存放方式则为:

内存地址

0x4000

0x4001

存放内容

0x12

0x34

有时候,用C语言写程序时需要知道是大端模式还是小端模式。 所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,刚好相反。我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。 下面这段代码可以用来测试一下你的编译器是大端模式还是小端模式: short int x;

char x0,x1;

x=0x1122;

x0=((char*)&x)[0]; //低地址单元
x1=((char*)&x)[1]; //高地址单元

若x0=0x11,则是大端; 若x0=0x22,则是小端......

int main()
{
short int x;

char x0,x1;

x=0*((char*)&x); //低地址单元 ,或者((char*)&x)[0];

x1=*((char*)&x + 1); //高地址单元,或者((char*)&x)[1];

printf("%x\n%x\n",x0,x1);
}

int checkCPU( )
{ 
    { 
           union w 
           {      int a; 
                  short b; 
           } c; 
            c.a = 0x12345678; 
           return(c.b == 0x5678);
    } 
} 
int main()
{
    printf("%d\n",checkCPU());
}

什么是大端、小端、网络字节序和主机字节序? 文章目录前言一、字节序1.大端2.小端二、如何判断自己的机器是大端还是小端总结 前言 注:我的笔记风格,可能不会特别官方,不会晦涩难懂,而是以一个初学者能看懂的方式把知识呈现出来,用最简单的语言把抽象的概念表达出来~ 先说点别的,计算机都是用字节来存储数据的,而数据是需要存储在计算机的硬件设备中的,我们知道内存就是一个很好的存储数据的硬件,这是其一;其二,一个设备和另一个设备进行网络通信的时候,必须要进行数据的通信,那么这个时候的数据是怎么存储的呢? 带着这两个问题,请往下看~ 一、字节序 字节序, 阅读详情

相关推荐

如何区别大端字节序和小端字节序

网络字节序,高位高地址,属于大端形式 主机字节序,高位低地址,属于小端形式, 注:如何没有规定字节序的话,POWERPC架构默认为大端字节序,arm架构默认为小端字节序。 例:int *p=0x12345678 int a=0x11223344 p=&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;a; 大端形式: 小端形式: 12H 34H 56H 78H .

陌上花开缓缓归以的博客 2379

高低位转换

高低位转换就是高位数据和低位数据互换。把0x1122的高低位转换之后是0x2211,0x1223344高低位转换之后是0x33441122。比如数据0x11223344,也就是数字287454020,其中0x1122是高位,0x3344是低位。比如数据0x1122,也就是数字4386,其中0x11是高位,0x22是低位。代码实现的话就是位运算,如下。

忆璇的博客 3404

强制类型转换

强制类型转换

Java学习之路-数据类型

数据类型 一、为什么需要定义数据类型? ​ Edwin Brady 在《Type-driven Development with Idris》中的说法,类型有以下几个重要角色: 对机器而言,类型描述了内存中的电荷是怎么解释的。 对编译器或者解释器而言,类型可以协助确保上面那些电荷、字节在程序的运行中始终如一地被理解。 对程序员而言,类型可以帮助他们命名、组织概念,帮助编纂文档,支持交互式编辑环境等。 Types serve several important roles: For a machin

White Chuan 705

MediaCodec视频解码流程详解及参考demo

本文主要讲解mediacodec的视频解码流程,及demo参考例子。

分享音视频技术 7872

emqx Java 订阅以及发送 结合若依框架

emqx Java 订阅以及发送 结合若依框架

Spo的博客 1613

为什么会有大小端模式之分呢?

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

loveprogram_1的专栏 7895

Android 关于佳博和汉印蓝牙热敏打印机开发,Android程序员必经的实践之路

针对于上面的问题,我总结出了互联网公司Android程序员面试涉及到的绝大部分面试题及答案,并整理做成了文档,以及系统的进阶学习视频资料。(包括Java在Android开发中应用、APP框架知识体系、高级UI、全方位性能调优,NDK开发,音视频技术,人工智能技术,跨平台技术等技术资料),希望能帮助到你面试前的复习,且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

2401_84149570的博客 1021

字节序的问题

    说到程序间的通信,说到底便是发送数据流。我们一般把字节(byte)看作是数据的最小单位。当然,其实一个字节中还包含8个比特(bit)──有时候我奇怪为什么很多朋友会不知道bit或是它和byte的关系。当我们拿到一系列byte的时候,它本身其实是没有意义的,有意义的只是“识别字节的方式”。例如,同样4个字节的数据,我们可以把它看作是1个32位整数、2个Unicode、或者字符4个AS

zhongjie的专栏 815

深入解析ViT中的RoPE旋转位置编码:原理、实现与视觉应用

本文深入解析了ViT中的RoPE旋转位置编码原理、实现及其在视觉任务中的应用。RoPE通过旋转变换巧妙地将相对位置信息融入注意力计算,解决了传统绝对位置编码外推性差的问题,在图像分类、目标检测及生成任务中展现出更优的泛化能力和灵活性。

alice7model的博客 705

全志T527-TP9930-Camera

TP9930 驱动模块主要实现将 4 路的 AHD/TVI/CVBS Camera 的数据转换为 BT656/BT1120 数据,从而实现在 T527 端来对数据进行处理和送显。

Linux驱动开发工程师,熟悉Linux/Android底层驱动、TP、显示、IIC、网络等通用外设调试适配,Linux上层应用开发。常用平台瑞芯微、全志、恩智浦等。 3234

大端字节序和小端字节序

大端字节序和小端字节序1.什么是大小端字节序2.验证大小端字节序 1.什么是大小端字节序 计算机硬件有两种储存数据的方式:大端字节序(MSB)和 小端字节序(LSB)。 小端字节序(LSB) 将这样的数据存储在计算机中,地址从地位到高位应该是:78 56 34 12 int a=0x12345678 一共四个字节的地址,假设从0x1001 ~ 0x1004;那么,对于小端字节序来说系统是这样存储的: 由图可以看出,小端字节序的存储规则是:数据的低位存储在地址低位,数据的高位存储在地址高位 大端字节序(

weixin_53361650的博客 4959

嵌入式开发之瑞芯微RK356x--基本环境搭建

嵌入式环境搭建

NexyHO的博客 617

字节序中大端字节序和小端字节序

最近参加面试遇到一些面试题,有些很常用的东西,但是不能准确说出所以然,拜读了https://blog.youkuaiyun.com/weixin_53361650和https://blog.youkuaiyun.com/taoshihan二位作者的文章,感觉清晰了不少,十分感谢二位博主的资料让我明白了原因。

weixin_46068274的博客 1334

Camera HAL Camx — DRQ总结

Camera HAL — DRQ(延迟请求队列)总结 DRQ是CAMX核心层的依赖驱动延迟执行调度器,解决Node处理请求时依赖未就绪的问题。其主要特点包括: 核心功能:当Node处理请求时缺少必要输入(property/metadata/fence),DRQ将其挂起并在依赖满足后重新调度,避免阻塞流水线或丢帧。 系统架构:Session持有主DRQ实例,管理该Session下所有Pipeline Node的依赖;CHI context另有独立DRQ实例专门处理Chi fence同步。 关键数据结构: De

DU_YULIN的博客 74

OpenClaw实战系列03:Slack/Telegram国际版接入实战指南

在当今的软件开发和工作流自动化中,将项目管理工具与即时通讯平台集成已成为提高团队协作效率的关键。OpenClaw作为一个开源的自动化工具,通过接入Slack和Telegram国际版,可以实现实时通知、自动化任务触发和团队协作的无缝对接。本文将详细介绍如何实现OpenClaw与这两个主流即时通讯平台的集成。OpenClaw是一个开源的自动化工作流引擎,支持多种触发器和执行器,能够帮助开发团队实现CI/CD流程、任务调度、监控告警等自动化场景。模块化设计:支持插件化扩展多触发器支持。

PeterPan的博客 586

理解字节序 大端字节序和小端字节序

以下内容参考了 http://www.ruanyifeng.com/blog/2016/11/byte-order.html https://blog.youkuaiyun.com/yishengzhiai005/article/details/39672529 1. 计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian)。 举例来说,数值0x2211使用两个字节储存:高位字节是0x22,低位字节是0x11。 大端字节序:高位字节在前,低位字节在后

一颗橙 8251

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

字节序的大端和小端

字节序(Byte Order)是指在多字节的数据类型(如整型、浮点型等)在内存中存储时,字节的排列顺序。大端字节序(Big-Endian):高位字节存储在低位地址,低位字节存储在高位地址。比如整数值 0x12345678,在内存中的存储顺序是:0x12(高位字节) 0x34 0x56 0x78(低位字节)。小端字节序(Little-Endian):低位字节存储在低位地址,高位字节存储在高位地址。

人工zz研究员的博客 2522

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

大端字节序、小端字节序和网络字节序总结

原创文章,转载请注明出处https://blog.youkuaiyun.com/aaron_lyn1985/article/details/54669451一、字节序  字节序是由于不同的主处理器和操作系统,对大于一个字节的变量在内存中的存放顺序不同而产生的。  字节序通常有大端字节序(Big Endian)和小端字节序(Little Endian)两种分类方法。二、大端、小端 "大端"和"小端"表示多字节值...

2876

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

大端、小端、与网络字节序 和 Tcp/IP 协议

一、在进行网络通信时是否需要进行字节序转换?      相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换。     原因如下:网络协议规定接收到得第一个字节是高字节,存放到低地址,所以发送时会首先去低地址取数据的高字节。小端模式的多字节数据在存放时,低地址存放的是低字节,而被发送方网络协议函数发送时会首先去低地址取数据(想要取高字节,真正取得是低...

leikun153的博客 1万+

【网络编程】字节序-大端和小端

摘要: 大端存储(高位字节在前)和小端存储(低位字节在前)是数据在内存中的两种存储方式。大端更符合人类阅读习惯,而小端在x86架构中更常见。可通过C++代码检测系统字节序:使用指针检查最低有效字节位置(方法1)或利用union联合体共享内存(方法2)。处理字节序转换时,可手动位操作、使用POSIX标准函数(htonl/ntohl)、C++20的std::endian或Boost库的boost::endian。网络通信中需统一字节序以避免数据解析错误。

Antonio915的博客 717

网络字节序和主机字节序(大端/小端)

(一)背景介绍 不同的CPU具有不同的字节序类型,这些字节序是指整数在内存中的保存顺序。最常见的有有两种: (1)little endian:小端,将低位字节保存在低位地址。 (2)big endian:大端,将高位字节保存在低位地址。 例子:如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为: big-endianlittle-endian 0x0...

Jackie_Ryan的专栏 9322
上一篇: C/C++内存区分配
下一篇: 回调函数讲解
bamboolsu
博客等级 码龄22年 200粉丝 394原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值