大端小端模式

大端与小端:显示、存储和读取 在文章《大端与小端》中,简单介绍了什么是大端与小端。就像打碎鸡蛋一样,你可以从大的那头打,也可以从小的那头打,但是鸡蛋还是那个鸡蛋。数据也是一样,你要么从高位存储或传输,要么从低位存储或传输,但是数据还是那个数据,它的大小是不会变的。... 阅读详情

开头讲个有关大端小端的故事:

  端模式(Endian)的这个词出自Jonathan Swift书写的《格列佛游记》。这本书根据将鸡蛋敲开的方法不同将所有的人分为两类,从圆头开始将鸡蛋敲开的人被归为Big Endian,从尖头开始将鸡蛋敲开的人被归为Littile Endian。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开。在计算机业Big Endian和Little Endian也几乎引起一场战争。  

 

  我们知道在内存中数据是以字节为单位进行存储的,每个地址单元对应着一个字节(byte),一个字节为8位(bite)。但是很多时候数据除了8bit额char外,还有16bit的short,32位的long型(要看具体的编译器),必然存在多字节安排的问题。不同的计算机存放多字节值的顺序不同,有些机器在起始地址存放低位字节(低位先存),即小端模式;有的机器在起始地址存放高位字节(高位先存),即大端模式。基于Intel的CPU,采用的是低位先存。而KEIL C51则为大端模式。大端小端对应着数据在存储器中的存放顺序。

  同时,在网络传输中,网络协议需要指定网络字节顺序,TCP/IP协议中使用16位整数和32位整数的高位先存模式,对应我们的大端模式。

  下面是两个具体例子:

  16bit宽的数0x1234在Little-endian模式(以及Big-endian模式)CPU内存中的存放方式(假设从地址0x4000开始存放)为:

内存地址 小端模式存放内容 大端模式存放内容
0x4000 0x34 0x12
0x4001 0x12 0x34

  32bit宽的数0x12345678在Little-endian模式以及Big-endian模式)CPU内存中的存放方式(假设从地址0x4000开始存放)为:

内存地址 小端模式存放内容 大端模式存放内容
0x4000 0x78 0x12
0x4001 0x56 0x34
0x4002 0x34 0x56
0x4003 0x12 0x78

  联合体union的存放顺序是所有成员都从低地址开始存放,利用该特性可以轻松地获得了CPU对内存采用Little-endian还是Big-endian模式读写。

  写程序判断处理器是Little-endian模式,还是Big-endian模式,可以通过以下程序:

  1>.通过将int强制类型转换成char单字节,通过判断起始存储位置。

void main(int argc, char **argv)   
 {   
     int i = 1;   
     char *cp = (char *)&i;  //前面是指针运算符*,前值类型转换。后面是取地址符号。 
      if (*cp)                //如果此时cp指向的内存为1的话,则为小端,否则为大端。   
          printf("Little Endian\n");   
     else    
         printf("Big Endian\n");   
     
     exit(EXIT_SUCCESS);   
 }

注释:如果小端方式中(i占至少两个字节的长度)则i所分配的内存最小地址那个字节中就存着1,其他字节是0.大端的话则1在i的最高地址字节处存放,char是一个字节,所以强制将char型量p指向i则p指向的一定是i的最低地址,那么就可以判断p中的值是不是1(或者为0,也即是假)来确定是不是小端。

或者如下程序:

void main()
{
    short int x;
    
    char x0,x1;
    
    x=0x1122;
    
    x0=((char*)&x)[0];  //低地址单元
    x1=((char*)&x)[1];  //高地址单元

    if (0x11 == x0 && 0x22 == x1)
    {
        cout << "Big_endian" << endl;
    }
    else
    {
        cout << "Little_endian" << endl;
    }
}
2>.利用联合体union的存放顺序是所有成员都从低地址开始存放,判断处理器模式。

bool checkCPU( )
{ 
    { 
        union w 
        {   
            int  a; 
            char b; 
            
        } c; 
        c.a = 1; 
        return(c.b ==1);
    } 
}
以及如下程序:

bool isLittleEndian()
{
  union _dword
  {
         int all;
       struct _bytes
       {
           char byte0; 
               char pad[3]; 
         }bytes;
}dword;
 
  dword.all=0x87654321;
 
  return (0x21==dword.bytes.byte0);  
}
分析:如果你的处理器调用函数isLittleEndian返回1,那么说明你的处理器为little endian,否则为big endian.注意,如果在little endian处理器上,byte0和pad按内存从低到高的存放顺序:LOW->byte0 pad[0] pad[1] pad[2] ->HIGH;0x87654321按内存从低到高的存放顺序:  0x21  0x43   0x65   0x87, 可见byte0对应到0x21。所以通过判断dword中第一个字节dword.bytes.byte0是否与0x21相等就可以看出是否是little endian。

过压保护电路(OVP) 作者:AirCity 2020.2.4 Aircity007@sina.com 本文所有权归作者Aircity所有 1 示例一 当VBUS=5V时,各点电压电流如图所示,Q1接近截止,输出信号是5V。 当VBUS=5.4V开始,输出信号开始下降,直到VBUS=6.1V,输出信号降低为0.6V。 下面是实测波形,这个电路,输出信号的电压不会超过5.4V,这个输出信号可用于电源的控制信号。 2 ... 阅读详情

相关推荐

鸿蒙子系统解读-分布式软总线子系统初步研究(下)

鸿蒙子系统解读-分布式软总线子系统初步研究(下) 本文作者:江苏润和软件股份有限公司 郎建中 3.2. 数据传输 上一节我们看了PublishService()函数的代码实现过程。被发现端发布服务后,软总线回调发布成功的函数中,被发现端需要使用CreateSessionServer()来创建会话的服务器等待发现端的连接创建会话。下面我们就来分析CreateSessionServer()函数的实现过程。 数据传输部分的代码位于foundation/communication/services/softbus

weixin_47070198的博客 3091

图解大小端模式

大端模式:数据的高字节存储在内存的低位地址上,低字节存储在内存的高位地址上【高低低高大】 例如,十六进制数0x123456789abcef00在内存段【0,7】中的分布 小端模式:数据的高字节存储在内存的高位地址上,低字节存储在内存的低位地址上【高高低低小】 例如,十六进制数0x123456789abcef00在内存段【0,7】中的分布 为什么会存在大端和小端这两种不同...

木木的博客 960

tkinter使用label视频播放

tkinter是python的界面开发包 使用tkinter显示视频流的一个办法是使用label来逐帧显示图片。 from Tkinter import * from PIL import ImageTk, Image import cv2 root = Tk() # Create a frame app = Frame(root, bg="white") app.grid() # Create a label in the frame lmian = Label(app) lmain.grid(

六十英里的专栏 5527

数据在内存中的存储方式与大端小端

(萌新编写,欢迎指正) 在内存中数据从低地址向高地址使用,创建整形时先占用4个字节,地址增加然后在创建下一个整形。(数组创建时是连续创建,单纯的创建变量可能并非连续,这个和编译器有关) 接下来把单位换成显示一个字节,它们的对应关系是 把单位放大成一个字节时,一个整形占用内存以后,数据应该按什么顺序存在内存中? 由此存储的方式可以分为大端字节序存储和小端字节序存储 大端是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中。小端是指数据的低位保存在内存的低地址中..

weixin_44112964的博客 1136

机器人导航学习历程(四)local planner

local planner   我们先来回顾一下Navigation的框架,可以看出位于红框中的local_planner是move_base节点的一部分,输入包括来自global_planner的全局的规划路径、里程计信息以及local_costmap的信息,输出是速度控制指令,作为控制器的输入。 base_local_planner   局部规划一般是用base_local_planner包...

yuniruchujian的博客 4413

使用Python下载ECMWF的ERA-5数据

一、注册账号 [官网]https://www.ecmwf.int/ 二、登录后获取下载key https://cds.climate.copernicus.eu/api-how-to 如图右侧红色框中的内容复制保存为TXT文件,并重命名为“.cdsapirc”,注意前面有点,保存在 C:\Users\username\.cdsapirc,(WINDOWS系统),username指当前电脑登录账户。 三、安装cdsapi库 以pycharm为例: 在pycharm中依次打开:File>setting

wise_sun的博客 7706

大端模式和小端模式

一、什么是大端,什么是小端 0x123456在内存中的存储方式(以一个byte为一个单元) - 大端模式 低地址 -----> 高地址 0x12 | 0x34 | 0x56 - 小端模式 低地址 -----> 高地址 0x56 | 0x34 | 0x12 二、为什么会有大小端之分 1. 一开始是由于不同架构的CPU处理多个字节数据的顺序不一样,比如x86的是小端模式,KEIL C51是大端模式。但是后来互联网流行,TCP/IP协议规定为大端模式,为了跨平台通信,还专...

weixin_39461846的博客 352

Anaconda报错no qt platform plugin could be initialized

今天因为在anaconda中安装了一个新包,安装成功后运行python 程序报错:no qt platform plugin could be initialized。 1.安装Anaconda3-4.2.0-Windows-x86_64,对应python版本为3.5.2,scikit learn版本是0.17。因为要用Isolation Forest算法,只有0.18以上版本scikit learn才包含此算法,所以想更新scikit learn。 conda install scikit-lear

zhang1806618的博客 1万+

大端存储和小端存储_计算机存储的大端法和小端法

01引言在计算机内存中,通常是以字节(Byte),也就是 8 个位(Bit)为基本存储单元(也有以 16 位为基本存储单元的)。对于跨越多个字节的数据类型(比如 int 长 4 个字节),如何在内存中对这些字节进行排序有两种常见的方法:大端法(Big-endian)和小端法(Little-endian)【注】首先不管是大端法还是小端法存储,计算机在内存中存放数据的顺序都是从低地址到高地址...

weixin_34901508的博客 1044

LSTM 双向 Bi-LSTM

LSTM 双向 Bi-LSTM

jacke121的专栏 1519

RT-DETR改进策略【独家融合改进】| SPD-Conv+PPA 再次提升模型针对小目标的特征提取能力

SPD-Conv是一种新的 CNN 构建模块,用于替代传统 CNN 架构中使用的步长卷积(strided convolution)和池化(pooling)层,它由空间到深度(Space-to-depth,SPD)层和非步长卷积(non - strided convolution)层组成。

Limiiiing的博客 1155

大端小端模式详解

一、大端模式和小端模式的起源         关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战。战争的原因:大家都知道,吃鸡蛋的时候,原始的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,就下令,命令所有的子民吃鸡蛋的时候,必

ycc541的专栏 730

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

大端模式 小端模式

    大端模式,是指数据的低位(就是权值较小的后面那几位)保存在内存的高地址中,而数据的高位保存在内存的低地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;    小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一

jamestaosh 2686

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

大端小端存储模式

大端小端存储模式。大端存储:将数据的低位保存在内存的高地址处,而数据的高位,保存在内存的低地址中。小端存储:将数据的低位保存在内存的低地址处,而数据的高位,保存在内存的高地址中。

如果这是最后一页 能否让我把故事重写 220

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

结构体中内存对齐&&大端小端模式

(题目来自牛客网)在一个64位的操作系统中定义如下结构体:struct st_task { uint16_t id; uint32_t value; uint64_t timestamp; }; 同时定义fool函数如下:void fool() { st_task task = {}; uint64_t a = 0x00010001; memcpy(&

zmysang的博客 3414

计算机中的小端模式和大端模式

[杂谈] 计算机中的小端模式和大端模式   我们都知道,内存中存储的是各种变量,各种奇葩东西,不用的变量占用不用的字长,例如在intel X86环境下,一个int占用两个字  0 1 2 3  4  5  6  7  8  9  0x30  0x31   0x32  0x33  0x34

yandaqijian的专栏 915

大端小端模式以及相互转化

文章目录概念记忆方法转化方法应用 概念 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中。(Big-Endian) 小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址。(Little-Endian) unsigned int value = 0x12345678为例 我们可以用unsigned char buf[4]来表示value ...

CaicaiNo.1 1925

大端小端模式,及其判别方法

点击打开链接

Giles__的博客 616

大端小端模式?看这一篇就足够了

大端小端模式?看这一篇就懂了

Jack的博客 137

大端小端存储模式详解及判断方法

文章目录大小端模式的概念两种模式出现原因两种模式的优劣大小端的应用情景判断机器的字节序 大小端模式的概念 当我们查看数据在内存中的存储情况时,我们经常会发现一个很奇怪的现象,什么现象呢? int main() { int i = 12; return 0; } 数据在内存中的存放方式似乎和我们想象的顺序不太一样,在我们的常规认知不一样,在我们的常规认知中,它的存放方式应该是 00 00 00 0c ,那造成这个现象的原因是什么呢? 这是因为在内存中存放数据通常会采用两种不同的存储模式:大端存储和

Jormungand_V的博客 4733

大端小端模式介绍

大端小端基本概念 计算机存储以字节为单位,除开少数可以支持位寻址的单片机(8051,8052等)以外,CPU最小的访存单元为8个比特位即一个字节,那么对于超过一个字节的数据类型在内存中的存储有以下两种模式。 大端模式(Big_endian): 字节数据的高字节存储在低地址中,而字节数据的低字节存储在高地址中。 小端模式(little_endian):字节数据的高字节存储在高地址中,而字节数据的低地址存储在低地址中。 以int数据类型举例。假设int在内存中的大小为两个字节,即占16位,有如下代码: in

草香农的博客 2801

大端模式 小端模式

通过一句话记住大端序和小端序的区别 在软件开发过程中,软件开发人员都知道大端序和小端序的概念,但是在真正使用的时候,傻傻分不清两种到底是怎么存储。 首先还是先看下基本概念: 1、大端模式:高字节保存在内存的低地址 2、小端模式:高字节保存在内存的高地址 我比较喜欢这么记忆 小端模式:低地址在小端 大端模式:低地址在大端 例子: 举例: var = 0x11223344,对于这个变量的最高字节为0x11,最低字节为0x44 (1)大端模式存储(存储地址为16位) 地址 数

qq_23923713的博客 236
上一篇: linux 下cgi控制机器重启
下一篇: 关于Linux静态库和动态库的分析
hackaday
博客等级 码龄15年 5粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值