現象與疑問
!0x00 == 0x01 // 為什麼結果是 1 (0x01) 而不是 0 (0x00)?
直覺認為:0x00 是 0,非 0 應為 0?
核心解釋
- 0x00 是整數常量 0(十六進制表示)。
! 是邏輯非運算符,操作數按標量語境求值:0 → false,非 0 → true。
!0x00 即 !0 → true(邏輯真值)。
- C 語言中邏輯運算結果類型為
int,true 的整數表示是 1。
- 十六進制下
1 記作 0x01。
關鍵區別:邏輯非 vs 位元非
| 運算符 | 名稱 | 操作對象 | 結果類型 | 示例 |
! | 邏輯非 | 標量(整體真假) | int (0 或 1) | !0x00 = 1, !0x12 = 0 |
~ | 位元非 (按位取反) | 每個二進制位 | 與操作數類型同寬 | ~0x00 = 0xFF (8位), ~0x0000 = 0xFFFF (16位) |
常見誤區澄清
「十六進制需要先轉二進制再邏輯運算」—— 錯誤。
邏輯運算直接作用於標量值,與進制表示無關。0x00、0、00(八進制)在語義上完全等價,都是整數 0。
進階:_Bool / stdbool.h 類型
#include
bool b = !0x00; // b = true (1)
printf("%d", b); // 輸出 1
// C99 起 _Bool 佔 1 字節,值域 0/1,邏輯運算結果可隱式轉換
總結口訣
「邏輯非看真假,結果只能 0 或 1;位元非翻每位,寬度跟著類型走。」
搞清 ! 與 ~ 的本質區別,十六進制、八進制、十進制在邏輯運算面前「一視同仁」。
- 上一篇文章: C 語言帶頭結點單鏈表插入排序:指針傳遞錯誤導致創建失效的根因與修正版
- 下一篇文章: MyBatis/Spring JDBC 批量插入無報錯但數據未入庫:事務未提交是隱形殺手
Copyright ©
程式碼之家 All Rights Reserved