int *num=(int*)"abcd";
printf("%x\n",*num );
閒來無事,寫了上面的兩句**,*num會列印出什麼呢?
一般分析:根據ansii碼,轉換成十六進製制,為61626364
可是輸出結果為:64636261
我們可能會懷疑指標num,
printf出位址後,它和a[0]的位址一樣。
然後,可能會懷疑printf函式的問題。
還有可能是堆上的問題,畢竟函式是在堆上開闢的空間。
、、、然後,對以上懷疑進行了一一驗證,均不是。
這時候突然想起了處理器大端小端的問題。
不同的處理器有不同的位元組序型別,當然,這是對乙個基本型別而言的。
比如:將num指向「abcd」的位址空間後,這裡被看做是乙個int的整體,那麼處理器是怎麼讀出這個int來的呢,a->b->c->d還是相反?
首先從a到d位址是由低位元組到高位元組的。
對於小端對齊(little endian)
位址的低(高)位儲存值的低(高)位 //值的位即個、十、百、千、萬、、、
而大端對齊(big endian)
位址的高(低)位儲存值的低(高)位 //個人覺得這樣的還是比較符合自己的思維,直觀明了
我們intel的x86系列的cpu都是小端對齊,因此現在也比較清楚為什麼例子中輸出的是64636261了
一般,我們判斷機器是大端還是小端對齊,用得最常見是共用體。
union test
;int main()
列印結果為:
首先我們應該知道b應該取的是a的低位元組
然後,根據列印出的是78,知道這也是值的低位,因此當前cpu是小端對齊的。
大小端對齊
不同的 cpu 有不同的位元組序型別 這些位元組序是指整數在記憶體中儲存的順序 這個叫做主機序 最常見的有兩種 基本知識,回顧一下 le little endian 最符合人的思維的位元組序 位址低位儲存值的低位 位址高位儲存值的高位 怎麼講是最符合人的思維的位元組序,是因為從人的第一觀感來說 低位...
mysql 大小端 記憶體大小端對齊
不同的 cpu 有不同的位元組序型別 這些位元組序是指整數在記憶體中儲存的順序 這個叫做主機序 最常見的有兩種 le little endian 最符合人的思維的位元組序 位址低位儲存值的低位 位址高位儲存值的高位 怎麼講是最符合人的思維的位元組序,是因為從人的第一觀感來說 低位值小,就應該放在記憶...
記憶體對齊及大小端
一 記憶體對齊問題 先看乙個面試題 c union s struct b long a union s 求sizeof union s 24 sizeof struct b 32 有幾個問題需要回答,記憶體對齊的規則是什麼?這個union 物件在記憶體中資料是怎麼排列的?大端小端都一樣嗎?1 記憶體...