[英]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.