zoukankan      html  css  js  c++  java
  • 大端模式 小端模式

    简介

    大端小端模式指的是不同类型的处理器在数据存储时的区别。。

    • 大端模式(高尾端模式即末端在高位):将数据的高字节放在低地址中,低字节放在高地址中。
    • 小端模式(低尾端模式即末端在低位):将数据的高字节放在高地址中,低字节放在低地址中。

    如: 0x01020304

    在大端模式的机器中存储形式如图:

    高地址<---------------------------------------------------------低地址
    04 03 02 01

    在小端模式的机器中存储形式如图:

    高地址<------------------------------------------------------低地址
    01 02 03 04

    判断

    可以使用程序测试本地机器是大端模式还是小端模式,

    #include "stdafx.h"
    #include "Windows.h"
    
    //         高地址  <---------------  低地址
    //大端存储:04 03 02 01
    //小端存储:01 02 03 04
    #define Testdata 0x01020304  //测试数据
    
    union TestEndMode
    {
        unsigned int u;
        unsigned char c[4];
    };
    
    int main(int argc, char* argv[])
    {
    
    /*    unsigned int a;
        int b = sizeof(char);
        BYTE c = 0x12;//十六进制:以0x开头
        BYTE d = 012;//八进制:以0开头
        printf("%d  %d",c,d);
    */
    
        int i;
        TestEndMode tstMode;
        tstMode.u = Testdata;
    
        printf("%08x
    ", tstMode.u);
        for (i = 0; i < 4; i++)
            printf("%02x", (unsigned int)(unsigned char)tstMode.c[i]);
        printf("
    ");//输出:01020304 处理器为大端模式;04030201 处理器为小端模式
        return 0;
    
    }

    翻转

    当不同的处理器的硬件通信时,大小端模式必然要多加考虑。一旦有大小端的区别,有一方必然要对数据进行处理。在处理时针对数据进行高低颠倒。可以根据联合体union的特点对数据进行翻转。

    union TestEndModeUInt
    {
        unsigned int value;//根据不同的数据类型,改变该类型
        unsigned char swapTemp[4];//数组长度需要根据类型进行更改
    };
    
    unsigned int SwapInt(unsigned int value)
    {
       int i = 0;
       TestEndModeUInt tstUInt;
       tstUInt.value = value;
       unsigned char temp;
       int len = sizeof(value);
    
        for(i = 0; i< len/2; i++)
        {
            temp = tstUInt.swapTemp[i];
            tstUInt.swapTemp[i] = tstUInt.swapTemp[len-i-1];
            tstUInt.swapTemp[len-i-1] = temp;        
        }
        return tstUInt.value;
    }

    存在状况

    目前Intel的80x86系列芯片是唯一还在坚持使用小端的芯片,ARM芯片默认采用小端,但可以切换为大端;而MIPS等芯片要么采用全部大端的方式储存,要么提供选项支持大端——可以在大小端之间切换。另外,对于大小端的处理也和编译器的实现有关,在C语言中,默认是小端(但在一些对于单片机的实现中却是基于大端,比如Keil 51C),Java是平台无关的,默认是大端。在网络上传输数据普遍采用的都是大端。详见

  • 相关阅读:
    Python入门day12——文件操作的补充
    day11作业
    Python入门day11——文件处理
    文本操作问题
    Python入门day10——基本数据类型之集合
    day09作业
    Pagination(分页) 从前台到后端总结
    Chrome使用技巧(几个月的心得)
    ASTA存在的问题
    SmartBinding实现DataSet与ListView的绑定及同步显示
  • 原文地址:https://www.cnblogs.com/zht01/p/7674959.html
Copyright © 2011-2022 走看看