Re: [問題] big endian中bit field 的問題
看板C_and_CPP (C/C++)作者descent (「雄辯是銀,沉默是金」)時間1年前 (2022/12/28 15:32)推噓0(0推 0噓 0→)留言0則, 0人參與討論串2/2 (看更多)
一樣用 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 ®
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 ®
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 臺灣), 12/28/2022 15:37:25
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章