Phân tích bài toán biểu diễn số nguyên trong C trên hệ thống 32-bit

Trong môi trường lập trình C trên nền tảng 32-bit, việc hiểu rõ cách biểu diễn số nguyên là yếu tố then chốt. Xét trường hợp biến a (kiểu int), b (kiểu short), và c (kiểu int). Khi a = 127, b = -9, kết quả của phép gán c = a + b sẽ được phân tích như sau:

Kiểu dữ liệu Độ dài bit Phương pháp lưu trữ
int 32 Bù hai (số có dấu)
short 16 Bù hai (số có dấu)

Quy trình chuyển đổi bù hai

  • Số dương: Giữ nguyên giá trị nhị phân. Ví dụ: 12710 = 011111112
  • Số âm:
    1. Duy trì bit dấu
    2. Đảo bit phần giá trị
    3. Cộng 1 vào kết quả
    Ví dụ: -910 → 100010012 (nguyên mã) → 111101102 (đảo bit) → 111101112 (bù hai)

Biểu diễn giá trị cụ thể

  • a = 127 (int 32-bit):
    00000000 00000000 00000000 01111111 → 0x0000007F
  • b = -9 (short 16-bit):
    11111111 11110111 → 0xFFF7

Quy tắc mở rộng dấu khi thực hiện phép toán

Khi thực hiện c = a + b, trình biên dịch sẽ mở rộng b từ 16-bit thành 32-bit:

  • Số âm: Điền bit 1 vào các bit cao
  • Số dương: Điền bit 0 vào các bit cao
  a (32-bit):  00000000 00000000 00000000 01111111  (0x0000007F)
  b mở rộng:   11111111 11111111 11111111 11110111  (0xFFFFFFF7)
  ------------------------------------------------
  Tổng:        1 00000000 00000000 00000000 01110110

Bit tràn cao nhất bị loại bỏ, kết quả thực tế: 00000000 00000000 00000000 01110110 (0x00000076)

Kiểm chứng bằng hệ thập lục phân

  FFFFFFF7  (-9 mở rộng)
+ 0000007F  (127)
-----------
 100000076  → Loại bỏ bit tràn → 00000076

Kết quả 11810 nằm trong phạm vi biểu diễn của kiểu int (±2,147,483,647), không xảy ra tràn số.

Bảng chuyển đổi nhị phân - thập lục phân

Nhị phân Thập lục phân
0111 7
1111 F

Quy tắc: Nhóm 4 bit nhị phân từ phải sang trái, điền số 0 khi cần thiết.

Thẻ: C-Language two-s-complement type-promotion

Đăng vào ngày 23 tháng 5 lúc 12:00