Re: [問題] union + struct + bitfield的問題

看板C_and_CPP (C/C++)作者 (薩哈拉雅)時間14年前 (2012/06/15 02:56), 編輯推噓2(207)
留言9則, 4人參與, 最新討論串2/3 (看更多)
※ 引述《rifiz (薩哈拉雅)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : freebsd 8.0 + gcc4.2.1 , run in winxp + virtualBox : 在網路閒逛 看到兩個非常奇怪的問題, 如下: : [case1] : 請問以下的union大小為多少呢??? : union A : { : struct : { : unsinged int p1:4; : unsigned int p2:2; : unsigned int p3:4; : unsigned int p4:6; : } : } : 經過測試結果是 4Bytes!!! : 我想的是bitfields 總共16bits = 2 Bytes, 所以應該為 2 Bytes才對阿 : 請問這邊是哪裡想錯了呢?? 又這邊有一般的規則嗎??? : [case2] : union A : { : struct : { : unsinged int p1:4; : unsigned int p2:2; : unsigned int p3:4; : unsigned int p4:6; : } : unsigned int kk; : } : union A obj = {3,2,4,5}; : printf("value of kk: %u\n", obj.kk); : 直接跑的結果是:316971043 : bit pattern: 10111111 10111111 00010101 00100011 : 思考: p1 p2 p3 p4 : 0011 10 0100 000101 : |<- 8 bits ->||<- 8bits->| : 以bytes為單位不管以big-endia or little endian寫入,都跟跑出來的結果差很多 : 但是呢 若是以bit-fields為單位以little endian順序寫入, 則結果的bit pattern : 後半段符合這個寫入結果.......(bit pattern前半段則是怎麼想都湊不出答案 @_@||) : 一樣都是想不透...請各方好手指點迷津 : 這邊是不是我想錯了, 用錯方法或是哪邊有規則可以推導類似的問題呢??? : 感謝大家!! → kiedveian:http://codepad.org/u7cNKXVD 06/14 15:17 → kiedveian:http://codepad.org/z5jJy7Ay 結果是5411…… keidveian大大的兩個link code都依樣但是output不一樣??????? 另外提一下 我發現我用的是anonymous struct, 不知道有沒有差別 (剛剛用k大的link試了一下 沒有差別~~) 另外5411 = = 00010101 00100011 也就是在我的例子裡面, bit pattern的後半部, 也就是union以little-endian一個個 把bit-field寫入(一次一個bit-field), 而跟我的例子不同的是, 其他bit部分都是0!! 大概這就是所說的 implement-dependent的差異!! 所以呢 實驗結論就是每個bit-field會被當成一組(或是當成一個byte) 依照endianess 的順序寫入, 不管bit-field的大小為何. 感謝大家!!!......若還有其他bit-field問題再來請問大家.... ------- 感想: 底層的東西真是麻煩 又是implementation dependent 不是作compiler或是訂定 標準的搞這個真的有點頭痛......規則難找.....累鼠了.... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.37.153.55

06/15 07:37, , 1F
記憶體多裝幾G,別頭痛了
06/15 07:37, 1F

06/15 09:18, , 2F
有時候不是記憶體夠不夠大, 比如我要program MMIO或者
06/15 09:18, 2F

06/15 09:19, , 3F
利用bit-field分項設定; 當然不考慮可攜或跨平台的話,
06/15 09:19, 3F

06/15 09:20, , 4F
2/3F中間少句: HW command, 而HW就是需要這樣的
06/15 09:20, 4F

06/15 09:21, , 5F
要出driver的那個特定平台與編譯環境生得出想要的binary
06/15 09:21, 5F

06/15 09:21, , 6F
就好XD
06/15 09:21, 6F

06/15 13:28, , 7F
第一個連結只有宣告結構,沒有物件
06/15 13:28, 7F

06/15 13:31, , 8F
該結構僅有16bit,其餘空間可能被預設值填滿
06/15 13:31, 8F

06/16 18:02, , 9F
如果用pack呢?http://ideone.com/Oa0dd
06/16 18:02, 9F
文章代碼(AID): #1FsZFMJF (C_and_CPP)
文章代碼(AID): #1FsZFMJF (C_and_CPP)