大端與小端

前兩天看到大端小端時,

小端:低字節的值在前,高字節的值在後

大端:高字節的值在前,低字節的值在後

看到一個c的語言題,不是很清楚:

 

#include <stdio.h>

int main()
{
       
    int a[5] = {1, 2, 3, 4, 5};

    int* ptr1 = (int*)(&a + 1);   
    int* ptr2 = (int*)((int)a + 1);
     
    printf("%x, %x/n", ptr1[-1], *ptr2);
      
    return 0;
}

 

輸出:

5, 2000000

對於輸出5,比較好理解。&a是一個指向數組a的指針,也就是一個二級指針。至於爲什麼會是這樣,我也不是很清楚了,
     後面的&a + 1相當於 address(a[0]) + sizeof(int) * 5,也與此相關。
但輸出2000000就不明白了。由於是與大小端相關的題目,我就先看看我的機子是大端還是小端,用的方法,很普遍的那種:
typedef union un_t1
{
    int i;
    char ch;
}un;

    un u1;
    u1.i = 1;
    if(u1.ch == 1)
        printf("It is littleendian./n");
    else
        printf("It is big endian./n");
結果,我的機子是小端的。
假設a[0]的地址是1,則在我的機子上,數組a的內存分佈如下:
1   2   3   4      5   6   7   8      9   10  11  12    13  14  15  16
01 00 00 00    02 00 00 00    03 00  00  00    04  00  00  00
則ptr2=2,又因爲我的機子的字長爲4個字節,所以*ptr2會一次讀取2 3 4 5這四個字節的值
00 00 00 02,按照小端的內存分佈規則----低字節的值在前,高字節的值在後----,所以*ptr2
的值爲2000000。按照這種思維,測試一下:
int* ptr2 = (int*)((int)a + 2);  *ptr2 = 20000
int* ptr2 = (int*)((int)a + 3);  *ptr2 = 200
int* ptr2 = (int*)((int)a + 4);  *ptr2 = 2
int* ptr2 = (int*)((int)a + 5);  *ptr2 = 3000000
果然與我預期一致。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章