编程判断大端方式还是小端方式
我自己的理解和代码如下:
如果数字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
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++了,結論沒錯,是小端的。
雷雷
聯合體就是聯合體內成員公用一塊儲存區,a用的空間也是b用的
不要用程式設計去測試
因為你無法控制編譯器行為
不同的編譯器產生的機器碼不同
因為這些東西c++和c語言規格都沒有明確規定
請查閱cpu手冊這才是唯一的方式
我在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可行,但是並沒有什麼卵用,脫褲子放屁的事