**16 位有符號整數 (int16_t)** 環境下,0xFFF9 才等於 -7。若為 32 位 int,0xFFF9 = 65529。
0xFFF9 = 1111 1111 1111 1001 (16 bits)
補碼: 1111 1111 1111 1001
按位取反: 0000 0000 0000 0110
加 1: 0000 0000 0000 0111 = 0x0007 = 7
∴ 原碼幅值 = 7 → 數值 = **-7**;-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
INT_MIN = -32768 (16位) / -2147483648 (32位) — <limits.h>;(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]);