大小端模式_百度百科


本站和网页 https://baike.baidu.com/item/大小端模式?fr=uenucom 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

大小端模式_百度百科
百度首页
网页
新闻
贴吧
知道
网盘
图片
视频
地图
文库
百科
进入词条
全站搜索
帮助
清除历史记录关闭
近期有不法分子冒充百度百科官方人员,以删除词条为由威胁并敲诈相关企业。在此严正声明:百度百科是免费编辑平台,绝不存在收费代编服务,请勿上当受骗!详情>>
首页
历史上的今天
百科冷知识
图解百科
秒懂百科
懂啦
秒懂本尊答
秒懂大师说
秒懂看瓦特
秒懂五千年
秒懂全视界
特色百科
数字博物馆
非遗百科
恐龙百科
多肉百科
艺术百科
科学百科
用户
蝌蚪团
热词团
百科校园
分类达人
百科任务
百科商城
知识专题
权威合作
合作模式
常见问题
联系方式
下载百科APP
个人中心
收藏
查看我的收藏
有用+1
已投票
大小端模式
播报
编辑
锁定
讨论
上传视频
特型编辑
电脑存储模式
大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,数据从高位往低位放;这和我们的阅读习惯一致。小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。
中文名
大小端模式
外文名
Big-endian/Little-endian
相关视频查看全部
目录
简明区分
名词解析
操作系统
判断处理器
现阶段状况
大小端模式简明区分
编辑
播报
下面以unsigned int value = 0x12345678为例,分别看看在两种字节序下其存储情况,我们可以用unsigned char buf[4]来表示valueBig-Endian: 低地址存放高位,如下:低地址---------------buf[0] (0x12) -- 高位字节buf[1] (0x34)buf[2] (0x56)buf[3] (0x78) -- 低位字节---------------高地址Little-Endian: 低地址存放低位,如下:低地址---------------buf[0] (0x78) -- 低位字节buf[1] (0x56)buf[2] (0x34)buf[3] (0x12) -- 高位字节--------------高地址内存地址小端模式存放内容大端模式存放内容0x40000x780x120x40010x560x340x40020x340x560x40030x120x78
大小端模式名词解析
编辑
播报
大端模式所谓的大端模式(Big-endian),是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;例子:0000430: e684 6c4e 0100 1800 53ef 0100 0100 00000000440: b484 6c4e 004e ed00 0000 0000 0100 0000在大端模式下,前32位应该这样读: e6 84 6c 4e ( 假设int占4个字节)记忆方法: 地址的增长顺序与值的增长顺序相反小端模式所谓的小端模式(Little-endian),是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。例子:0000430: e684 6c4e 0100 1800 53ef 0100 0100 00000000440: b484 6c4e 004e ed00 0000 0000 0100 0000在小端模式下,前32位应该这样读: 4e 6c 84 e6( 假设int占4个字节)记忆方法: 地址的增长顺序与值的增长顺序相同大小端模式至于为什么要区分大小端,这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 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处理器还可以随时在程序中(在ARM Cortex 系列使用REV、REV16、REVSH指令
[1]
)进行大小端的切换。图解对于0x11223344 储存如下
名字由来在乔纳森·斯威夫特的著名讽刺小说《格列夫游记》中,小人国内部分裂成Big-endian和Little-endian两派,区别在于一派要求从鸡蛋的大头把鸡蛋打破,另一派要求从鸡蛋的小头把鸡蛋打破。斯威夫特借以讽刺英国的政党之争,在计算机工业中指数据储存顺序的分歧。编辑器模式下面这段代码可以用来测试一下你的编译器是大端模式还是小端模式:short int x;
char x0,x1;
x=0x1122;
x0=((char*)&x)[0]; //低地址单元
x1=((char*)&x)[1]; //高地址单元
若x0=0x11,则是大端; 若x0=0x22,则是小端......从上面的程序还可以看出,数据寻址时,用的是低位字节的地址。简单大小端转换的宏#definesw16(x)\
 ((short)(\
 (((short)(x)&(short)0x00ffU)<<8)|\
 (((short)(x)&(short)0xff00U)>>8)))
大小端模式操作系统
编辑
播报
static union { char c[4]; unsigned long l; }endian_test = { { &apos;l&apos;, &apos;?&apos;, &apos;?&apos;, &apos;b&apos; } };
#define ENDIANNESS ((char)endian_test.l)
(如果ENDIANNESS=’l’表示系统为little endian,为’b’表示big endian )。
大小端模式判断处理器
编辑
播报
通过下列的程序可以确认在某个硬件平台上的某个操作系统是大端还是小端:VB6:&apos; 注意这个CopyMemory的声明与一般的不一样,
&apos; 一般的都是(pDst As Any, pSrc As Any, ByVal ByteLen As Long)
&apos; 为了能够逐字节访问u,所以前面两个参数改成了按值传递,配合VarPtr函数获取变量地址
Private Declare Sub CopyMemory Lib "kernel32" Alias _
    "RtlMoveMemory" (ByVal pDst As Long, ByVal pSrc As Long, ByVal ByteLen As Long)
Private Sub Form_Load()
    &apos; VB的Integer占用2个字节!Long才是4个字节
    &apos; 32位应用程序的指针是4个字节
    Dim uptr As Long
    Dim aptr As Long
    Dim bptr As Long
    Dim cptr As Long
    Dim dptr As Long
    
    Dim u As Long
    
    &apos; 储存u从低地址到高地址的4个字节
    Dim a As Byte
    Dim b As Byte
    Dim c As Byte
    Dim d As Byte
    
    u = 367328153 &apos; 十六进制数:15 E4 FB 99
    
    uptr = VarPtr(u) &apos; VarPtr函数是内置函数,但是msdn不说,作用是获取变量的地址
    
    aptr = VarPtr(a)
    bptr = VarPtr(b)
    cptr = VarPtr(c)
    dptr = VarPtr(d)
    
    CopyMemory aptr, uptr + 0, 1 &apos; 将u逐字节按顺序写入a,b,c,d
    CopyMemory bptr, uptr + 1, 1
    CopyMemory cptr, uptr + 2, 1
    CopyMemory dptr, uptr + 3, 1
    
    &apos; Windows系统,英特尔处理器:最后输出的是99 FB E4 15
    MsgBox Hex(a) & " " & Hex(b) & " " & Hex(c) & " " & Hex(d)
End Sub
在英特尔处理器,Windows10操作系统上,对话框显示的结果是99 FB E4 15,与直接求出来的16进制值15 E4 FB 99正好相反,所以是小端的。C++语言(VS2013下,控制台项目):#include <iostream>
using namespace std;
typedef unsigned char byte;
// 转换char(视为整数类型)为16进制字符串
void ChtoHex(byte Val, char* dest)
    // 辗转相除法,倒序看得到结果
    byte tmp = Val % 16;
    if (tmp >= 0 && tmp <= 9)
    {
        dest[1] = &apos;0&apos; + tmp;
    }
    else if (tmp >= 10 && tmp <= 15)
    {
        dest[1] = &apos;A&apos; + tmp - 10;
    }
    tmp = (Val/16) % 16;
    if (tmp >= 0 && tmp <= 9)
    {
        dest[0] = &apos;0&apos; + tmp;
    }
    else if (tmp >= 10 && tmp <= 15)
    {
        dest[0] = &apos;A&apos; + tmp - 10;
    }
    // 设置&apos;\0&apos;
    dest[2] = &apos;\0&apos;;
// 主函数
int main()
    int u = 367328153; // 原始数据,8位16进制为15 E4 FB 99
    byte a, b, c, d;   // u从低地址到高地址的四个字节
    // a~d对应的16进制字符串,预留3个字符
    char Sa[3], Sb[3], Sc[3], Sd[3]; 
    byte* k = (byte*)&u;
    a = k[0];
    b = k[1];
    c = k[2];
    d = k[3];
    // 转成16进制字符串
    ChtoHex(a, Sa);
    ChtoHex(b, Sb);
    ChtoHex(c, Sc);
    ChtoHex(d, Sd);
    cout << Sa << " " << Sb << " " << Sc << " " << Sd << endl;
    system("pause");
    return 0;
在英特尔处理器,Windows10操作系统上,控制台显示的结果是99 FB E4 15,与直接求出来的16进制值15 E4 FB 99正好相反,所以也证明是小端的。C语言(VC++6.0,控制台工程):#include <stdio.h>
typedef unsigned char byte;
// 转换char(视为整数类型)为16进制字符串
void ChtoHex(byte Val, char* dest)
    // 辗转相除法,倒序看得到结果
    byte tmp = Val % 16;
    if (tmp >= 0 && tmp <= 9)
    {
        dest[1] = &apos;0&apos; + tmp;
    }
    else if (tmp >= 10 && tmp <= 15)
    {
        dest[1] = &apos;A&apos; + tmp - 10;
    }
    tmp = (Val/16) % 16;
    if (tmp >= 0 && tmp <= 9)
    {
        dest[0] = &apos;0&apos; + tmp;
    }
    else if (tmp >= 10 && tmp <= 15)
    {
        dest[0] = &apos;A&apos; + tmp - 10;
    }
    // 设置\0
    dest[2] = &apos;\0&apos;;
// 主函数
void main()
    int u = 367328153; // 原始数据,8位16进制为15 E4 FB 99
    byte a, b, c, d;   // u从低地址到高地址的四个字节
    // a~d对应的16进制字符串,预留3个字符
    char Sa[3], Sb[3], Sc[3], Sd[3]; 
    byte* k = (byte*)&u;
    a = k[0];
    b = k[1];
    c = k[2];
    d = k[3];
    // 转成16进制字符串
    ChtoHex(a, Sa);
    ChtoHex(b, Sb);
    ChtoHex(c, Sc);
    ChtoHex(d, Sd);
    printf("%s %s %s %s\n", Sa, Sb, Sc, Sd);
    scanf_s("%d", &a);
在英特尔处理器,Windows10操作系统上,结果跟上面是一样的,输出的16进制数是反序的,证明是小端系统。C#(VS2013下,控制台项目):using System;
namespace ConsoleApplication1
    class Program
    {
        static void Main(string[] args)
        {
           int u = 367328153;  // 原始数据,8位16进制为15 E4 FB 99
           byte[] bytes;       // u从低地址到高地址的四个字节
            // 获取
            bytes = System.BitConverter.GetBytes(u);
            Console.WriteLine(
                bytes[0].ToString("X") + " " +
                bytes[1].ToString("X") + " " +
                bytes[2].ToString("X") + " " +
                bytes[3].ToString("X")
                );
            Console.ReadLine();
        }
    }
在英特尔处理器,Windows10操作系统上,结果跟上面还还是一样的,输出的16进制数是反序的,证明是小端系统。MDK(Keil5,STM32F407)C语言:#include "stm32f4xx.h"
int main(void)

    int u = 367328153; // 原始数据15 E4 FB 99
    int* k = &u;
    return 0;
编译连接然后下载到开发板上,然后启动调试,通过监视窗口可以看到u的地址,然后在内存窗口可以看到字节序是反序的,所以说明STM32F407是小端的。据某些资料说ARM内核是可以设置大小端的,但是STM32是外设自动进入了小端,似乎是无法调整的。
89C52(Keil5)C语言:最后来一个大端的例子。手头上没有51的开发板,所以用的是软件仿真。#include <reg52.h>
int main()
    int longbit = sizeof(long);
    
    long u = 367328153; // 原始数据15 E4 FB 99
    long* k = &u;
    
    return 0;
注意看了,C52是8位的处理器,long才是4个字节的,看监视窗口longbit的值就知道了(紫色框)。然后再看内存窗口,就会发现u的存储是跟原始数据给的顺序是一样的,所以C51和C52是大端的。
大小端模式现阶段状况
编辑
播报
Intel的80x86系列芯片是唯一还在坚持使用小端的芯片,ARM芯片默认采用小端,但可以切换为大端;而MIPS等芯片要么采用全部大端的方式储存,要么提供选项支持大端——可以在大小端之间切换。另外,对于大小端的处理也和编译器的实现有关,在C语言中,默认是小端(但在一些对于单片机的实现中却是基于大端,比如Keil 51C),Java是平台无关的,默认是大端。在网络上传输数据普遍采用的都是大端。
[2]
百度百科内容由网友共同编辑,如您发现自己的词条内容不准确或不完善,欢迎使用本人词条编辑服务(免费)参与修正。立即前往>>
词条图册
更多图册
参考资料
Joseph Yiu著,吴常玉、曹孟娟、王丽红译.ARM Cortex-M3与Cortex-M4权威指南(第3版).北京:清华大学出版社,2015:6.5 存储器的端 140-142
字节存放顺序:大尾,小尾 20
.ChinaUnix&#91;引用日期2015-10-18&#93;
图集
大小端模式的概述图(1张)
V百科往期回顾
词条统计
浏览次数:次
编辑次数:68次历史版本
最近更新:
椰子爽
(2021-12-17)
简明区分
名词解析
操作系统
判断处理器
现阶段状况
为您推荐广告
新手上路
成长任务
编辑入门
编辑规则
本人编辑
我有疑问
内容质疑
在线客服
官方贴吧
意见反馈
投诉建议
举报不良信息
未通过词条申诉
投诉侵权信息
封禁查询与解封
©2022 Baidu 使用百度前必读 | 百科协议 | 隐私政策 | 百度百科合作平台 | 京ICP证030173号
京公网安备11000002000001号
进入词条
清除历史记录关闭
播报
编辑
讨论
收藏
登录
扫码下载百科APP
领取50财富值奖励
分享到微信朋友圈
打开微信“扫一扫”即可将网页分享至朋友圈
选择朗读音色
00:00
00:00

Copyright ©uecom 京ICP备18064371号-1 IPV6
2024-03-29 03:27:05
uenu.com
10.0.12.16