首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言十六進制運算與復合賦值運算符詳解:0xabc、0xdef、-= 機制分析

     編輯:C 語言問答

原始代碼與輸出


#include <stdio.h>
int main(void) {
    int x1 = 0xabc, x2 = 0xdef;
    x2 -= x1;
    printf("%X\n", x2);  // 輸出: 333
    return 0;
}

逐步推導

  1. 十六進制字面量轉十進制:
    • 0xabc = 10×16² + 11×16¹ + 12×16⁰ = 2560 + 176 + 12 = 2748
    • 0xdef = 13×16² + 14×16¹ + 15×16⁰ = 3328 + 224 + 15 = 3567
  2. 復合賦值運算:
    • x2 -= x1 等價於 x2 = x2 - x1
    • x2 = 3567 - 2748 = 819
  3. 結果轉十六進制輸出:
    • 819 ÷ 16 = 51 餘 3 → 低位 3
    • 51 ÷ 16 = 3 餘 3 → 中位 3
    • 3 ÷ 16 = 0 餘 3 → 高位 3
    • 結果:0x333 (十六進制)
  4. printf 驗證:
    • %X 以大寫十六進制輸出無符號整數 (對應 unsigned int)
    • 819 以 %X 輸出即 333
    • 若用 %d 輸出則為 819

核心知識點總結

概念說明示例
十六進制字面量0x 或 0X 前綴,數字 0-9、字母 A-F/a-f0xabc, 0XDEF
復合賦值運算符op= 等價於 var = var op expr,var 只求值一次-=, +=, *=, /=, %=, <<=, >>=, &=, ^=, |=
x -= y 語義x = x - y,非 x = -y 或 x = y - x10 -= 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 輸出整數十六進制。
  • 忽略有符號溢出 UB:int x = 0x7fffffff; x += 1; 有符號溢出屬未定義行為,無符號則定義為模 2ⁿ 環繞。

總結

0xabc=2748, 0xdef=3567, 3567-2748=819, 819(10)=0x333(16)。
x2 -= x1 即 x2 = x2 - x1。
%X 輸出無符號整數大寫十六進制。**十六進制在底層開發 (寄存器/內存/網絡協議/文件格式) 中極常見,熟練轉換與位運算思維是核心基本功。**

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved