在x86下,有下列程序
#include <stdio.h>#include <windows.h>int main(){ union { short k; char i[2]; }*s,a; s = &a; s->i[0] = 0x39; s->i[1] = 0x38; PRintf("%x/n",a.k); system("pause"); return 0;}輸出的結果是()
A.3839 B.3938 C.380039 D.不確定
這道題是在考我們對大小端字節序的知識。
首先我們來認識一下字節序,顧名思義字節的順序,也就是大于一個字節類型的數據在內存中的存放順序。
那么字節序分為兩類:Big-Endian和Little-Endian。
引用標準的Big-Endian和Little-Endian的定義如下:
a) Little-Endian就是低位字節排放在內存的低地址端,高位字節排放在內存的高地址端。
b) Big-Endian就是高位字節排放在內存的低地址端,低位字節排放在內存的高地址端。
c) 網絡字節序:4個字節的32 bit值以下面的次序傳輸:首先是0~7bit,其次8~15bit,然后16~23bit,最后是24~31bit。這種傳輸次序稱作大端字節序。由于 TCP/ip首部中所有的二進制整數在網絡中傳輸時都要求以這種次序,因此它又稱作網絡字節序。
比如,以太網頭部中2字節的“以太網幀類型”,表示后面數據的類型。對于ARP請求或應答的以太
網幀類型來說,在網絡傳輸時,發送的順序是0x08,0x06。在內存中的映像如下圖所示:
該字段的值為0x0806。按照大端方式存放在內存中。---------------------------------------------------------------------------------------
我們來看看C程序中內存空間布局情況:

以上圖為例 如果我們在棧上分配一個unsigned char buf[4],那么這個數組變量在棧上是如何布的?

現在我們對于高低地址有了認識,那么高低字節又是怎么回事呢?
假如我們把上面的buf[4](正好四個字節)合起來看成一個32位無符號整型0x12345678,這樣的話,高位是0x12還是 0x78 ? 低位呢? 我們來回想一下我們接觸最多的十進制數,靠左邊的是高位,靠右邊的低位。 當然啦,其他進制也是這樣的。我們來回到上面的問題,0x12345678,高位到低位的字節依次是0x12 0x34 0x56 0x78.
我們再來回顧一下Big-Endian和Little-Endian的定義 ,并用圖示來說明這兩種字節序:
就用剛才的unsigned int value = 0x12345678為例,用unsignedchar buf[4]來表示value:

在現有的平臺上Inter的x86采用的是Little-Endian,Sun的SPARC采用的是Big-Endian。
終于回到了我們這道題上,x86下低地址存放低位:
所以選A。
新聞熱點
疑難解答