c++ - 大端方式小端方式编程判断
PHP中文网
PHP中文网 2017-04-17 13:05:51
0
6
830

编程判断大端方式还是小端方式
我自己的理解和代码如下:
如果数字0x12345678
那么大端方式从低地址到高地址依次存储 0x12 0x34 0x56 0x78
如果是小端方式的话从低地址到高地址依次存储 0x78 0x56 0x34 0x12
我的程序如下:

int main()
{
    unsigned int i=0x12345678;
    cout<<hex<<i<<endl;
    char *p=(char *)&i;
    if(*p==0x78)
        cout<<"little Endition"<<endl;
    else
        cout<<"Big Endition"<<endl;
    
    return 0;
}

结果输出却让我大跌眼镜

12345678
Big Endition

输出我有点看不懂,一般笔记本不都是大端方式吗?
还有一个问题,编程实现大端方式小端方式,我在网上搜了下还有用UNION联合体,没看懂,求解答。联合体不是在同一时刻只能存储一个变量吗,在给c.a赋值后,c.b怎么可能为1呢?

int checkCPU()
{
    {
        union w
        {
            int a;
            char b;
        }c;
        c.a = 1;
        return (c.b == 1);
    }
}

附上个人电脑信息:
MacBook Pro (Retina, 13-inch, Early 2015)
处理器 2.7 GHz Intel Core i5
编辑器 Xcode6

PHP中文网
PHP中文网

认证高级PHP讲师

全部回覆(6)
小葫芦

c++看不懂,就說說union吧。假設int 是4個byte,那麼當設定c.a=1後,大端的話內存為0x00000001, 因為高位都是0,最低位為01,內存從左往右地址是從低到高,符合大端定義高位位元組在記憶體位址低位。
小端則相反,記憶體中為 0x01000000。 b為char,佔一個位元組,且為低記憶體位址的一個字節,如果在小端模式,則為0x01, 大端模式為0x00。結論是如果 c.b==1 回傳true, 則為小端。

補充:Intel x86 processors 都是小端,現在大部分機器都是Intel的cpu吧。

看懂c++了,結論沒錯,是小端的。

黄舟

雷雷

Ty80

聯合體就是聯合體內成員公用一塊儲存區,a用的空間也是b用的

小葫芦

不要用程式設計去測試
因為你無法控制編譯器行為
不同的編譯器產生的機器碼不同
因為這些東西c++和c語言規格都沒有明確規定
請查閱cpu手冊這才是唯一的方式

Peter_Zhu

我在x86_64平台(Intel core i5-4590)上,用你的程序,的確測出了小端。
(話說endian寫法錯了吧…)
手上沒MacbookPro可以試。
沒看出你的寫法有什麼問題,只能說這結果很奇怪…

下面說union的用法。
union的意思是「這段記憶體資料的類型可能是以下其中一種:…」
(編譯器會自動分配一段內存,確保足夠放下裡面最大的型別)
所以題中的union的意思,是指「c這個變數既可能是int,也可能是char」。
而c.a就是“把c當作int看待”,c.b就是“把c當作char看待”。
也就是說,c.a等價於(int)(&c),c.b等價於(char)(&c)。
所以,先用c.a再用c.b是沒問題的,你只是在不同時刻把c當成不同的類型進行操作而已。
然後就跟你寫的程式沒什麼分別了…

洪涛

Intel 處理器確實是小端的,誰告訴你筆記本是大端了.
直接char跟多字節類型比較就好了..UNION可行,但是並沒有什麼卵用,脫褲子放屁的事

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板