首頁  >  問答  >  主體

c++ - 大端方式小端方式编程判断

编程判断大端方式还是小端方式
我自己的理解和代码如下:
如果数字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中文网2714 天前802

全部回覆(6)我來回復

  • 高洛峰

    高洛峰2017-04-17 13:07:51

    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++了,結論沒錯,是小端的。

    回覆
    0
  • 黄舟

    黄舟2017-04-17 13:07:51

    雷雷

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 13:07:51

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

    回覆
    0
  • 高洛峰

    高洛峰2017-04-17 13:07:51

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

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 13:07:51

    我在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當成不同的類型進行操作而已。
    然後就跟你寫的程式沒什麼分別了…

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 13:07:51

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

    回覆
    0
  • 取消回覆