先看下面的代碼:
#include<stdio.h> int main () { int a; char *x; x = (char *) &a; a = 512; x[0] = 1; x[1] = 2; printf("%d\n",a); return 0; } // 針對x86的處理器來說,其結果為513
原因
程序首先聲明了一個int變量,在我的電腦中,此int占用4字節。然后聲明了一個x指針,同樣,在我的電腦中它占用8字節。然后將a的內存地址賦值給x指針,注意這里用到了類型轉換:x=(char *) &a。如果不使用類型轉換,x指向的int型的內存單元大小為4字節,如果使用了類型轉換,x指向的char型的內存單元大小為1字節。
變量a的值為512,用4個字節的普通二進制表示就是:
00000000 00000000 00000010 00000000
由於x86 CPU的字節序為小端序(最低有效位在最高有效位的前面),所以前面的二進制以小端序的表示方式為:
00000000 00000010 00000000 00000000
操作方式是:先獲取最右邊的8位數字,然后放到新行的左邊;然后獲取下一個8位數字,再放到新行的左邊,它緊挨着上一個8位數字。以此循環操作,直到數據讀取完畢。注意的是一個字節(8位)里的數字順序是不變的。
x[0]表示指向a內存區域的第一個字節,並設置為1,此時的a內存表示為:
00000001 00000010 00000000 00000000
然后是x[1]設置為2,則a內存表示為:
00000001 00000010 00000000 00000000
然后將a內存轉為普通二進制表示方式(方式為從右到左讀取):
00000000 00000000 00000010 00000001
最后的結果為:
513
最后修改時間:2018-01-26 19:55