看板 C_and_CPP 關於我們 聯絡資訊
一樣用 qemu, 安裝 ppc32 debein8 測試, 這個花了我比較多時間。 ref: https://gist.github.com/nstarke/c6593da117c459c18c255395211fa311 ppc32 (gdb) p reg $1 = {B1 = {A1 = 9 '\t', A2 = 0 '\000', A3 = 1 '\001', A4 = 1 '\001', A5 = 4 '\004', A6 = 22136}, B2 = 305419896 (0x12345678), memory layout (gdb) x/4xb &reg 0xbffffb28: 0x12 0x34 0x56 0x78 x86 (gdb) p reg $2 = {B1 = {A1 = 18 '\022', A2 = 0 '\000', A3 = 1 '\001', A4 = 0 '\000', A5 = 3 '\003', A6 = 30806}, B2 = 2018915346 (0x78563412), B3 = "\022\064Vx"} memory layout (gdb) x/32xb &reg 0xffffd058: 0x12 0x34 0x56 0x78 memory layout 都一樣, 但 bit fields 的解釋卻不一樣。 ※ 引述《ca5270 (蘭陵哭哭生)》之銘言: : 各位大神好,小弟在最近的面試中碰到了這類的考題 : Q:在big endian中B1.A1的值會是多少 : 小弟的想法是因為在little endian中會取REG_SET.B3[0]這個記憶體中的低7位,值為0x12, : 所以在big endian中會取記憶體中的高7位,所以值為0x9,請問這樣的想法正確嗎 : typedef unsigned char u8; : typedef unsigned short u16; : typedef unsigned long u32; : typedef union{ : struct{ : u8 A1 :7; : u8 :1; : u8 A2 :2; : u8 A3 :1; : u8 A4 :1; : u8 A5 :4; : u16 A6; : } B1; : u32 B2; : u8 B3[4]; : } REG_SET : REG_SET.B3[0] = 0x12; : REG_SET.B3[1] = 0x34; : REG_SET.B3[2] = 0x56; : REG_SET.B3[3] = 0x78; -- 紙上得來終覺淺,絕知此事要躬行。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.217.141.102 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1672212767.A.28E.html ※ 編輯: descent (180.217.141.102 臺灣), 01/01/2023 00:37:40