程序员面试系列——大小端
大小端是哪里來的概念
大端、小端是“字節(jié)順序”里面的概念。字節(jié)順序可以分為大端序、小端序、混合序。
什么是字節(jié)順序
“字節(jié)順序”簡(jiǎn)稱為“字節(jié)序”。
在計(jì)算機(jī)系統(tǒng)中,存儲(chǔ)對(duì)象一般是以字節(jié)為單位的,每個(gè)地址單元都對(duì)應(yīng)著一個(gè)字節(jié)。
對(duì)于單字節(jié)對(duì)象,存放方法和傳輸方式一般相同。
對(duì)于多字節(jié)對(duì)象,情況就不同了。我們必須建立兩個(gè)規(guī)則:
- 這個(gè)對(duì)象的地址是什么
- 在存儲(chǔ)器中如何排列這些字節(jié)
這個(gè)對(duì)象的地址是什么
在幾乎所有機(jī)器上,多字節(jié)對(duì)象都被存儲(chǔ)為連續(xù)的字節(jié)序列,對(duì)象的地址為所使用字節(jié)中最小的地址。
例如在C語言中,一個(gè)類型為int的變量x地址為0x100.
對(duì)于32位硬件平臺(tái),int類型的變量占4個(gè)字節(jié),那么這4個(gè)字節(jié)將被存儲(chǔ)在存儲(chǔ)器的0x100, 0x101, 0x102, 0x103位置。
在存儲(chǔ)器中如何排列這些字節(jié)
關(guān)于字節(jié)的排列,一般有兩種規(guī)則:小端法(little endian)與大端法(big endian)。
首先介紹兩個(gè)概念。
- 最高有效字節(jié)(the Most Significant Byte):指多字節(jié)序列中具有最大權(quán)重的字節(jié)。
- 最低有效字節(jié)(the Least Significant Byte):指多字節(jié)序列中具有最小權(quán)重的字節(jié)。
比如0x123456,最高有效字節(jié)是0x12,最低有效字節(jié)是0x56.
弄清楚了以上概念,我們就可以討論大小端了。
小端(最符合人類思維的字節(jié)序 )
規(guī)則:順著地址增加的方向,按照從最低有效字節(jié)到最高有效字節(jié)的順序存儲(chǔ)。
記憶口訣:高址高字節(jié)
為什么說是最符合人類思維的字節(jié)序?因?yàn)閺倪壿嫷慕嵌葋碚f,高有效位在高地址處,低有效位在低地址處,想起來很自然。
大端(最直觀的字節(jié)序)
規(guī)則:順著地址增加的方向,按照從最高有效字節(jié)到最低有效字節(jié)的順序存儲(chǔ)。
記憶口訣:高址低字節(jié)
為什么說是最直觀字節(jié)序?假設(shè)存儲(chǔ)地址從左到右依次增加,請(qǐng)把這個(gè)對(duì)象讀出來,將你讀的內(nèi)容,從左到右填充內(nèi)到存即可。
舉例
假設(shè)要把對(duì)象0x87654321存儲(chǔ)到地址0x1000處,大小端的區(qū)別如下圖所示:
用C語言編程判斷大小端
解法一
int is_little_endian(void) { int a = 0x12345678; char b = *(char *)&a; if( b == 0x78){ return 1; //小端} else { return 0; //大端} }解法二
int is_little_endian(void) { union temp { int a; char b; }temp; //聯(lián)合體所有成員共享存儲(chǔ)空間 temp.a = 0x12345678; if( temp.b == 0x78 ){ return 1; //小端} else { return 0; //大端} }【參考資料】
https://zh.wikipedia.org/wiki/%E5%AD%97%E8%8A%82%E5%BA%8F
http://blog.csdn.net/fuxingwe/article/details/8736262
總結(jié)
以上是生活随笔為你收集整理的程序员面试系列——大小端的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自定义依赖注解无效_关于Apt注解实践与
- 下一篇: 队列的C语言实现(通过内核链表)