簡體   English   中英

為什么看起來數組在聯合中被反向索引?

[英]Why does it look like arrays are indexed backways in a c union?

在c中創建無符號整數和4字節數組的並集時,字節的順序似乎相反。 為什么是這樣?

對於具有二進制表示形式的整數10000000 00000000 00000000 00000000,我期望b [0] = 10000000,b [1] = 00000000等。

#include <stdio.h>
#include <stdlib.h>

typedef union intByteRep{
    unsigned int i;     // 00000000 00000000 00000000 00000000
    unsigned char b[4]; //   b[0]     b[1]     b[2]     b[3]  - What we would expect
                        //   b[3]     b[2]     b[1]     b[0]  - What is happening  
} intByteRep;

char *binbin(int n);

int main(int argc, char **argv) {

    intByteRep ibr;
    ibr.i = 2147483648; // 10000000 00000000 00000000 00000000

    for(int i = 0; i < 4; i++){
        printf("%s ", binbin(ibr.b[i]));
    }
    printf("\n"); // prints 00000000 00000000 00000000 10000000

    for(int i = 3; i >= 0; i--){
        printf("%s ", binbin(ibr.b[i]));
    }
    printf("\n"); // prints 10000000 00000000 00000000 00000000

    return 0;
}

/*function to convert byte value to binary string representation*/
char *binbin(int n)
{
    static char bin[9];
    int x;
    for(x=0; x<8; x++)
    {
        bin[x] = n & 0x80 ? '1' : '0';
        n <<= 1;
    }
    bin[x] = ' ';
    return(bin);
}

因為您的系統是小端的。

32位整數0x11223344存儲在內存中0x44 0x33 0x22 0x11

在大字節序系統上,它將存儲為: 0x11 0x22 0x33 0x44

順便說一句,大多數流行的uP都是小字節序。

字節在內存中的存儲順序取決於您平台上的字節序。 在這種情況下,您的系統是低位字節序,因此您觀察到它們構成的int較高地址上的字節包含最高有效位(在您的2147483648的示例中,最高有效位為單個1位) )。

在通常要求計算機處理單個步驟所能處理的數字的時代,加法和減法通常要求計算機首先處理數字的低位部分,就像一個人處理數字的方法一樣。手。 如果將123與123相加,並以每個加數的最后一位(3和8)開始,則可以確定結果1的最后一位,將其寫下來,而不必理會是一個進位,甚至不必看加數的任何其他部分。 然后,可以將中間數字與前一個數字的進位相加,並知道結果的中間數字為0,而不必查看任何一個操作數的第一位。 然后可以計算結果的第一位。

如果將1加到7開始,那么直到一個人也處理完第二和第三位后,才能確定地寫入結果的第一位。 因此,要么要么一直跟蹤所有數字直到完成計算,要么願意寫下較早數字的不正確結果,然后在有進位的情況下進行調整。 不太好或沒有效率。

雖然可以先將較大的數字存儲在內存中,但仍然可以從小端開始進行計算,但是如果對象的地址直接標識將要使用的對象的第一部分,則地址計算會更有效。 因此,大多數系統將每個對象的最低有效部分存儲在內存中,然后再存儲最高有效部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM