C Bit Field 使用注意事項
C Bit Field 在存取暫存器的欄位是非常好用的,例如
我定義一個 Union 如下:
很合理吧,根據每個欄位的長度定義資料型態,結果很慘,讀回來的資料沒錯,但對應到欄位時完全不對。
後來參考 msdn C Bit Fields 才知道欄位的型態宣告只能用 unsigned int, signed int or int,所以我的 union 修改如下就一切正常了。
PS:
我定義一個 Union 如下:
union CacheParameters { struct { enCacheType byCacheType : 5; BYTE byCacheLevel : 3; BOOL bSelfInitializing : 1; BOOL bFullyAssociativeCache : 1; BYTE : 4; WORD wMaximumNumberOfThreadsSharingThisCache : 12; BYTE byMaximumNumberOfProcessorCoresInThisPhysicalProcessorPackage : 6; WORD wSystemCoherencyLineSize : 12; WORD wPhysicalLinePartitions : 10; WORD wWaysOfAssociativity : 10; DWORD dwNumberOfSets : 32; BOOL bWBINVD_INVD_BehaviorOnLowerLevelCaches : 1; BOOL bCacheIsInclusiveToLowerCacheLevels : 1; BOOL bComplexCacheIndexing : 1; DWORD : 29; } fields; struct { DWORD eax; DWORD ebx; DWORD ecx; DWORD edx; } registers; };
很合理吧,根據每個欄位的長度定義資料型態,結果很慘,讀回來的資料沒錯,但對應到欄位時完全不對。
後來參考 msdn C Bit Fields 才知道欄位的型態宣告只能用 unsigned int, signed int or int,所以我的 union 修改如下就一切正常了。
union CacheParameters { struct { DWORD byCacheType : 5; DWORD byCacheLevel : 3; DWORD bSelfInitializing : 1; DWORD bFullyAssociativeCache : 1; DWORD : 4; DWORD wMaximumNumberOfThreadsSharingThisCache : 12; DWORD byMaximumNumberOfProcessorCoresInThisPhysicalProcessorPackage : 6; DWORD wSystemCoherencyLineSize : 12; DWORD wPhysicalLinePartitions : 10; DWORD wWaysOfAssociativity : 10; DWORD dwNumberOfSets : 32; DWORD bWBINVD_INVD_BehaviorOnLowerLevelCaches : 1; DWORD bCacheIsInclusiveToLowerCacheLevels : 1; DWORD bComplexCacheIndexing : 1; DWORD : 29; } fields; struct { DWORD eax; DWORD ebx; DWORD ecx; DWORD edx; } registers; };
PS:
- Reserved 的欄位可以不設定欄位名稱,這樣在程式中就不會參考到了
- 原本以為欄位總長度不能超過 32 bits,沒想到也一併解決了!
留言