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

C語言移位操作深度解析:有符號/無符號、邏輯/算術右移、補碼機制與內存字節碼打印技巧

     編輯:關於C語言

三組對比實驗

聲明x << 1x >> 1
unsigned char x=36 (00000110)1 (00000001) 邏輯右移
char x=36 (00000110)1 (00000001) 多數機器算術右移
char x=-3-6 (11111010)-2 (11111110) 算術右移

核心規則

  • 左移:高位移出,低位補 0(無符號/有符號同)
  • 右移:
    • 無符號 → 邏輯右移:高位補 0
    • 有符號 → 算術右移(多數機器):高位補符號位(符號位擴展)
    • C 標準**未強制規定**有符號右移行為,屬實現定義

補碼機制回顧

  • 正數補碼 = 原碼
  • 負數補碼 = 符號位不變,數值位取反 +1
  • 3 = 00000011;-3 = 11111101

實戰驗證:打印內存字節碼

void print_char(char x) {
    unsigned char *bp = (unsigned char *)&x;
    int size = sizeof(x);
    for (int i = 0; i < size; i++)
        printf("%.2x", bp[i]);
    printf("\n");
}

可直接觀察變量在內存中的真實二進制佈局,驗證移位結果。

避坑指南

  1. 不要假設有符號右移為算術右移(雖然 99% 機器如此)
  2. 移位位數 ≥ 位寬屬未定義行為
  3. 負數移位位數屬未定義行為(C 標準)
  4. 跨平台代碼涉及右移時,顯式轉換為無符號或使用除法
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved