1. 程式人生 > >大端模式和小端模式

大端模式和小端模式

說明 dia style 得出 nio 特性 所有 訪問 img


1. 為什麽會產生兩種模式:
在計算機中我們是以字節為單位的,每一個地址單元都對應著一個字節,一個字節就是8位,c語言中char類型之外,還
有四個字節的int,個字節的longlong類型,並且除了對於超過8位的處理器,比如32位處理器,64位處理器,由於寄存器的寬
度、大於一個字節就必然存在著字節安排的問題,因此就出現了大端模式和小端模式

2.兩種模式的定義:
在計算機的結構體系中,對於字節,字等的存儲機制有所不同,,目前在各個體系的計算機中通常采用的字節存儲機制
主要有兩種:大端模式和小端模式,大端模式:就是將高位的數據(權重較高的數據)存放在地址上,小端模式:就是


將低位的數據(權重較低的數據)存放在低位的地址上,采用大端模式存取數據比較符合人的思維,但是采用小端模式
存放數據更有利於計算機處理,所以到目前為止,誰好誰壞還沒有定論。
例子:

如果定義一個整型(int)的變量:int a=0x12345678,這個整型變量在內存中的存儲在大小端的不同的模式下存儲情況
大端模式的存儲由下圖所示:

技術分享

小端模式的存儲如下圖所示:

技術分享

註意:這裏說明一點,存儲是以字節為單位的,所以一個字節內的數據是不用遵循大端模式和小端模式的,就像小端模式中是0x78,而

不是0X87
3.大端和小端的應用:
談到字節排序問題就必定會牽扯到兩大cpu的派系,那就是motorola的powerPC系列的CPU和intel的X86系列,powerPC系列


的CPU采用的是大端模式,intel的X86系列采用的是小端模式
大端模式:網絡,大多通信協議是大端的,powerPC,IBM,Sun
小端模式:主機,一般操作系統是小端的,X86,DEC
ARM既可以工作在大端模式也可以工作在小端模式
4. 測試本地設備采用的是大端模式還是小端模式:

第一種方法:定義一個大於一個字節的數據類型的變量假設為變量為a,用小於變量a的數據類型的指針進行強制轉化
將變量地址進行截斷,然後再用*間接訪問該地址中所存的數據,看看是高位數據還是低位數據,就可以得出結果了,
代碼如下圖所示:

#include <stdio.h>
bool
isbigendian () { int a=0x12345678; char b=(*(char*)&a); if (b=0x1) { return true; } return false; } int main () { if(isbigendian ()) { printf ("該設備下是大端模式\n"); } else { printf ("該設備下是小端模式\n"); } return 0; }

技術分享

第二種方法:運用聯合體的特性:聯合體union在任何同一時刻聯合體都只存放一個被選中的成員,並且所有所有成員都是
從低地址開始存放,;利用這一特性,我們可以定義一個聯合體,先定義一個字節數大於1變量例如int a;在定義一個字
節數小於變量a的變量,然後將變量a進行賦值,然後訪問變量b,如果是高位上的數字就是大端模式,如果是低位上的數
字就是小端模式,代碼如下圖所示:

#include <stdio.h>
bool isbigendian1 ()
{
     union sun
    {
        short a;
        char b;
    }sun;
    sun.a=0x1234;
    if (sun.b=0x12)
    {
        return true;
    }
    else
    {
        return false ;
    }
}
int main ()
{
    if (isbigendian1 ())
    {
        printf ("該設備是使用的是大端模式\n");
    }
    else
    {
        printf ("該設備使用的是小端模式\n");
    }
    return 0;
}

技術分享


5.通信:
網絡上傳輸數據普遍采用的是大端模式,powerPC處理器主導網絡市場,可以絕大多數的通信設備都使用的是powerPC處
理器這也可能就是網絡上絕大多數的協議采用的是大端模式的原因,因此,在使用小端模式處理器需要使用網絡通信時
需要在軟件中處理端模式的轉變

大端模式和小端模式