#include <stdio.h>
int fun(int a)
{
char *arr[] = {"0000", "0001","0010","0011","0100",
"0101","0110","0111","1000","1001","
1010","1011","1100","1101","1110","1111"};
unsigned char* p = (unsigned char*) &a ;
p =3;
int i;
for(i = 0; i < sizeof a; i ) {
int d = (*p)>>4;
printf("%s", arr[d]);
d = (*p) & 0xf;
printf("%s ", arr[d]);
p--;
}
}
當使用引數 9 呼叫時,下面的函式將列印多少個 1?(假設 sizeof int 為 4 個位元組)
我的想法:一個整數會像這樣存盤在記憶體中 |00000000|00000000|00000000|00001001| 假設地址是這樣的 100-101-102-103;現在 p 包含 a 的地址,所以它將包含 100 對嗎?現在我們將它型別轉換為 char 指標,現在它將增加 1 而不是資料型別的大小。p =3 在這個陳述句之后 p 將包含 103 對嗎?現在 for 回圈開始 d=(*p) >> 4 現在不是 *p 將包含 00001001 嗎?如果我們右移 4 次 d 將包含 0 并且 arr[0] 將被列印,現在是 '0000' 現在 d = (*p) & 0xf 現在如果我們按位執行 00001001 并且使用 11111111 d 應該包含 9 右和 a[9 ] 應該列印但 arr[0] 再次列印。
請幫我形象化謝謝
編輯:輸出為 00000000 00000000 00000000 00001001
uj5u.com熱心網友回復:
我假設您正在使用基于 Intel/AMD 的機器,這意味著整數以小端格式存盤。這意味著像 12 34 56 78 這樣的十六進制數字(添加空格只是為了便于閱讀)被存盤為 78 56 34 12。
&a是你的int的地址。因此((char *)(&a)) 3將指向 int (12) 的最后一個位元組。
for 回圈中的部分首先取位元組的前半部分,即最高有效位,列印二進制表示,然后繼續處理包含最低有效位的后半部分。
int d = (*p)>>4; // shifts the 4 higher bits to the lower bits
printf("%s", arr[d]);
d = (*p) & 0xf; // zeroes the 4 higher bits
printf("%s ", arr[d]);
p--; // positions to the next byte of the int
uj5u.com熱心網友回復:
每個位元組都是 8 位,不清楚你為什么要移位4而不是8
請注意,位元組序與位元組順序有關,而不是位。在 little-endian 和 big-endian 系統中,位總是以相同的方式存盤。
此代碼的大/小端的結果將相同:
int a = 0x12345678;
for (int i = 0; i < sizeof(a); i )
{
//print the byte to the right of number
printf("%X ", a & 0xff);
a >>= 8; //<- not related to endian-ness
}
輸出總是78 56 34 12。它是向后列印的,因為我們是從右向左列印的。
如果您列印 的位1,您將獲得10000000兩個系統。再次因為我們從右到左列印。但它總是存盤在記憶體中b00000001
在 big-endian 系統中,數字0x12345678在記憶體中存盤為12345678,而 little-endian 將其存盤為78563412。如果使用直接從記憶體復制,我們會得到相互矛盾的結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/380461.html
