#include <stdio.h>
int main(void) {
int x1 = 0xabc, x2 = 0xdef;
x2 -= x1;
printf("%X\n", x2); // 輸出: 333
return 0;
}
0xabc = 10×16² + 11×16¹ + 12×16⁰ = 2560 + 176 + 12 = 27480xdef = 13×16² + 14×16¹ + 15×16⁰ = 3328 + 224 + 15 = 3567x2 -= x1 等價於 x2 = x2 - x1x2 = 3567 - 2748 = 819%X 以大寫十六進制輸出無符號整數 (對應 unsigned int)819 以 %X 輸出即 333%d 輸出則為 819| 概念 | 說明 | 示例 |
|---|---|---|
| 十六進制字面量 | 0x 或 0X 前綴,數字 0-9、字母 A-F/a-f | 0xabc, 0XDEF |
| 復合賦值運算符 | op= 等價於 var = var op expr,var 只求值一次 | -=, +=, *=, /=, %=, <<=, >>=, &=, ^=, |= |
x -= y 語義 | x = x - y,非 x = -y 或 x = y - x | 10 -= 3 → 7 |
%X 格式 | 輸出 unsigned int 為大寫十六進制,無 0x 前綴 | 255 → "FF" |
%x 格式 | 輸出小寫十六進制 | 255 → "ff" |
| 有符號/無符號輸出 | %X 期望 unsigned int,傳 int 會隱式轉換 (位模式不變) | -1 → "FFFFFFFF" (32位) |
0xdef = 1101 1110 1111
- 0xabc = 1010 1011 1100
-------------------
0x333 = 0011 0011 0011
每組 4 位獨立相減無借位,結果每組均為 0011 (即 3),直觀展示十六進制逐位運算特性。
-= 是負號:x -= y 中 - 是減法運算符,= 是賦值,合為復合賦值。**不是** x = -y。%X 與 %p:%p 輸出指針地址 (通常帶 0x 前綴、實現定義格式),%X 輸出整數十六進制。int x = 0x7fffffff; x += 1; 有符號溢出屬未定義行為,無符號則定義為模 2ⁿ 環繞。0xabc=2748, 0xdef=3567, 3567-2748=819, 819(10)=0x333(16)。
x2 -= x1 即 x2 = x2 - x1。
%X 輸出無符號整數大寫十六進制。**十六進制在底層開發 (寄存器/內存/網絡協議/文件格式) 中極常見,熟練轉換與位運算思維是核心基本功。**