我有一個小片段:
int main()
{
unsigned long long x = 0x0000000000008342;
unsigned long long * x_p = &x;
unsigned int * y_p = (unsigned int *)x_p;
unsigned int y = *y_p;
printf("y = %#.8x\n", y);
}
對于小端,這就是數字的存盤方式。
0x00: 42 83 00 00
0x04: 00 00 00 00
但是為什么列印 0x00008342 而不是 0x00004283 ?
uj5u.com熱心網友回復:
Endianess 適用于所有大于 1 個位元組的整數型別。我不明白為什么你認為位元組序只適用于你的 64 位整數型別而不適用于int......這似乎是你困惑的根源。
您的代碼的一個主要問題unsigned int y = *y_p;是未定義的行為。什么是嚴格的別名規則?因此,不能假定您的程式具有確定性行為。
如果要實際列印存盤在記憶體中的位元組,則需要逐位元組執行此操作:
for(size_t i=0; i<sizeof x; i )
printf("%.2X ", ((unsigned char*)&x)[i] );
這種轉換很好,因為字符型別是嚴格別名的特殊例外。它42 83 00 00 00 00 00 00按預期列印。
此外,您在此處有輕微的外觀問題:0x0000000000008342。不要像你寫了一個 64 位整數常量那樣寫前導零。這個的型別實際上是int(32位系統)或unsigned int(8/16位系統)。前導零不做任何事情,您需要附加ull后綴。這在這個特定片段中不是問題,但如果您將這種風格帶入實際程式,則可能會成為問題。
uj5u.com熱心網友回復:
printf("%x\n", unsigned_number);將列印值的unsigned_number十六進制就像printf("%u\n", unsigned_number);將列印在小數。
也不關心 的內部表示unsigned_number。
printf("%x",...)不執行十六進制轉儲(當然,除非您在資料的每個字符上回圈呼叫它)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/324792.html
上一篇:用C撰寫階乘函式
