※ 引述《ando5566》之銘言:
: 各位版友日安,
: 最近小弟要將32bits平台的CAN protocol API, porting 至8bits平台上,
: 遇到了一個問題, 如下:
...
: 但是因為我的原意是porting, 所以我不希望影響任何其他寫法,
^^^^^^^
: 嘗試過使用union的作法, 但是仍會面臨無法使EID定址在第12bit的問題。
: 想請教版上高手, 有其他方法嗎?
: 謝謝!
我不知道這篇為什麼沒有人回正解...
在我唸書的時候
記得老師曾經說過「C 的 bit-fields 不要亂用」
尤其是在涉及 memory format (layout) 相關操作的時候
像是 network package 的格式、操作 CPU registers …
一開始覺得沒什麼
但後來真的有看過用 C 開發的 http APIs 竟然用 bit-fields 來 mapping 封包
也看過 Arduino 的教學文件竟然是用 bit-fields 在操作 LED 燈和 GPIO
所以我覺得推文只要一句「bit-fields 不要亂用」
應該就足夠了
不然,
問 google 也會給你答案
`c bit fields portability' 或 `bit fields portability'
有趣的是,差一個 C 搜出來的會是不同答案
不過觀點是一致的
總之,你需要的是透過 bit manipulation 來操作
(有時候打包成 macro 會直接叫 bitmask, bitset 或 bitops....)
ref: https://stackoverflow.com/a/263738