現象重現
根因:整型提升與符號擴展
char 是否有號由實現定義(通常有號)。
0xC9 二進制 11001001,最高位 1 → 負數。
- 傳給
printf(可變參數)時發生整型提升:char → int。
- 有號擴展:高位填充符號位 1 →
0xFFFFFFC9。
%x 以無號十六進制打印該 32 位模式 → fffffffC9。
兩種修正方案原理
| 方案 | 代碼 | 原理 |
| 強轉無號 | (unsigned char)c | 提升時視為無號,高位補 0 → 0x000000C9 |
| 位掩碼 | c & 0xFF | 先提升為 0xFFFFFFC9,再 & 0xFF 保留低 8 位 → 0x000000C9 |
最佳實踐建議
- 位操作、IO 處理統一用無號類型:
uint8_t、unsigned char。
- 打印位模式用
%02x 配合 (unsigned char) 或 & 0xFF。
- 嚴禁直接
printf("%x", signed_char)。
Linux 內核風格
內核代碼大量使用 & 0xFF,因強轉可能被編譯器優化掉,位掩碼語義更明確、無歧義。
總結
0xffffff 前綴是 C 整型提升規則的直接體現。理解「提升→符號擴展→可變參數傳遞→格式化輸出」完整鏈路,是嵌入式、系統編程、網絡協議解析的必修課。
- 上一篇文章: Swift 與 Objective-C 互操作:C 指針傳遞、內存管理與 UnsafeMutablePointer 實戰
- 下一篇文章: C語言結構體與函數傳遞數組:返回結構體、數組退化為指針
Copyright ©
程式碼之家 All Rights Reserved