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

C 語言整數內存存儲:ASCII 碼 vs 二進制補碼 vs 內存字節序深度解析

     編輯:程式設計綜合問答

三種「存儲形式」概念辨析

概念含義100 (十進制) 示例
ASCII 碼存儲 將數字作為**字符串**存儲,每個字符佔 1 字節 '1' '0' '0' → `0x31 0x30 0x30` (3 字節)
二進制補碼存儲 數值在 CPU 寄存器/內存中的**真實二進制位模式** (補碼表示) `0x00000064` (32位 int, 大端) / `0x64 0x00 0x00 0x00` (小端)
內存存儲 (字節序) 多字節類型在內存中**按地址順序排列的字節序列** (大端/小端) 小端機 (x86/ARM): 低位字節低地址 → `64 00 00 00`

教材圖解還原 (以 short/int16_t 為例,2 字節)

假設 16 位系統 `short` 佔 2 字節,數值 100:

  • 二進制補碼:`00000000 01100100` (高位在前,邏輯視圖)
  • 內存小端序存儲:地址 A → `0x64` (低字節),地址 A+1 → `0x00` (高字節)
    圖中「內存存儲形式」顯示兩個格子:`64` 和 `00`,順序與邏輯補碼**高低字節互換**。
  • ASCII 存儲:`'1' '0' '0'` → 三個格子 `31 30 30`。

為什麼圖中二進制存儲一格、內存存儲兩格?

  • 教材簡化:將 16 位補碼 `0000000001100100` 畫為**一個 16 位格子** (邏輯整體)。
  • 內存實際按**字節寻址**,拆分為**兩個 8 位格子** (低字節、高字節)。
  • 「二進制存儲形式」展示**數值的完整位模式**;「內存存儲形式」展示**物理字節排布**。

驗證程序 (查看內存字節序)

#include 
#include 

void print_bytes(const void *ptr, size_t size) {
    const unsigned char *p = (const unsigned char*)ptr;
    for (size_t i = 0; i < size; i++) {
        printf("%02X ", p[i]);
    }
    printf("\n");
}

int main() {
    int16_t val = 100; // 0x0064
    printf("邏輯補碼 (大端視圖): 0x%04X\n", val);
    printf("內存字節序 (小端機): ");
    print_bytes(&val, sizeof(val)); // 輸出: 64 00
    
    // 對比 ASCII
    char str[] = "100";
    printf("ASCII 碼: ");
    print_bytes(str, 3); // 輸出: 31 30 30
    return 0;
}

擴展:浮點數/結構體/聯合體內存佈局

  • 浮點數遵循 IEEE 754:符號位、指數位、尾數位,同樣受字節序影響。
  • 結構體因**內存對齊**插入填充字節,`sizeof` 可能大于成員大小之和。
  • 聯合體成員共享起始地址,可用於檢測字節序:
    `union { uint16_t v; uint8_t b[2]; } u = {0x0064}; // u.b[0]==0x64 即小端`
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved