Re: [問題] union + struct + bitfield的問題
※ 引述《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
06/15 07:37, 1F
推
06/15 09:18, , 2F
06/15 09:18, 2F
→
06/15 09:19, , 3F
06/15 09:19, 3F
→
06/15 09:20, , 4F
06/15 09:20, 4F
→
06/15 09:21, , 5F
06/15 09:21, 5F
→
06/15 09:21, , 6F
06/15 09:21, 6F
→
06/15 13:28, , 7F
06/15 13:28, 7F
→
06/15 13:31, , 8F
06/15 13:31, 8F
→
06/16 18:02, , 9F
06/16 18:02, 9F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 3 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章