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

C語言中 0xFFF9 等於 -7 的原理:補碼表示與有符號數運算

     編輯:C 語言問答

前提條件

**16 位有符號整數 (int16_t)** 環境下,0xFFF9 才等於 -7。若為 32 位 int,0xFFF9 = 65529。

逐步推導 (16 位補碼)

  1. 十六進制 → 二進制:
    
    0xFFF9 = 1111 1111 1111 1001 (16 bits)
        
  2. 符號位:最高位 (bit 15) = 1 → **負數**;
  3. 補碼 → 原碼 (求絕對值):
    
    補碼: 1111 1111 1111 1001
    按位取反: 0000 0000 0000 0110
    加 1:       0000 0000 0000 0111 = 0x0007 = 7
        
    ∴ 原碼幅值 = 7 → 數值 = **-7**;
  4. 驗證:-7 + 7 = 0 在補碼中無溢出自動丟棄進位,完美閉環。

通用公式

對於 n 位有符號整數,無符號值 U 對應的有符號值 S:


S = (U < 2^(n-1)) ? U : (U - 2^n)
// 例:n=16, U=0xFFF9=65529
// 65529 >= 32768 → S = 65529 - 65536 = -7

C 語言保證

  • INT_MIN = -32768 (16位) / -2147483648 (32位) — <limits.h>;
  • 有符號溢出是 **未定義行為 (UB)**,但**無符號溢出定義為模 2^n 環繞**;
  • 強制轉換:(int16_t)0xFFF9 實現定義為補碼截斷 (現代編譯器均如此)。

調試技巧


// GDB 查看內存原始字節
(gdb) x/hx &var   // 顯示 16 位十六進制
(gdb) x/hd &var   // 顯示 16 位有符號十進制
// 或用 union 觀察
union { int16_t s; uint16_t u; uint8_t bytes[2]; } v = { .u = 0xFFF9 };
printf("signed=%d, unsigned=%u, bytes=%02X %02X\n", v.s, v.u, v.bytes[0], v.bytes[1]);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved