0
0x0 0x6 0x0 0x1
BIG - 00000000 00000110 00000000 00000001小尾數
LIT - 00000001 00000000 00000110 00000000
所以我期待0xcfb01420 + 2是爲0x6,但事實並非如此。我錯過了什麼嗎?
(gdb) p &tx_q_sem->mlock.u.mtxa_owner
$41 = (volatile __uintptr_t *) 0xcfb01420
(gdb) p/x tx_q_sem->mlock.u.mtxa_owner
$34 = 0x601
(gdb) p (char)*(char*)(0xcfb01420+0)
$36 = 0x1
(gdb) p (char)*(char*)(0xcfb01420+1)
$37 = 0x6
(gdb) p (char)*(char*)(0xcfb01420+2)
$38 = 0x0
(gdb) p (char)*(char*)(0xcfb01420+3)
$39 = 0x0
我的假設是,小尾數格式的0x601的字節序列應該與我上面表示的方式相匹配。因此第二個字節應該全部爲零。在那裏,我猜想所有的啃都是正確的。
使用'的x/4xb 0xcfb01420'以檢查在存儲器中的4個字節,分別表示各字節。比打印更容易。儘管你也可以完成'p/x(char [4])tx_q_sem-> mlock.u.mtxa_owner',我想。 –
感謝您的評論,但是我想我沒有清楚地表達我的想法。即使用你的方法也沒有什麼變化我的問題是在GDB中沒有正確顯示小端。對於x86小端格式,0x6應該位於第三個字節。 (gdb)x/4xb 0xcfb01420給我 0xcfb01420:0x01 0x06 0x00 0x00。還是我的轉換本身是錯誤的? –
請記住,一個字節是2個十六進制數字(半字節)寬。湯姆的回答是正確的,當你單獨打印每個字節時,gdb會忽略前導零。 '0x601'中'6'的位置值是2^8:它是* 2nd *字節底部的'6 *(1U << 8)'。 –