最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言大小端格式舉例詳解

 更新時間:2025年12月18日 10:18:15   作者:一個平凡而樂于分享的小比特  
大小端是嵌入式C語言中一個重要的概念,它涉及到多字節(jié)數(shù)據(jù)在內(nèi)存中的存儲順序,下面這篇文章主要介紹了C語言大小端格式的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

一、什么是大小端格式

大小端指的是多字節(jié)數(shù)據(jù)在內(nèi)存中的存儲順序。

1.小端格式 (Little Endian)

  • 低字節(jié)存放在低地址
  • 高字節(jié)存放在高地址
  • 像Intel x86/x64、ARM(默認)使用小端
#include <stdio.h>

int main() {
    int num = 0x12345678;  // 十六進制數(shù)
    unsigned char *p = (unsigned char *)#
    
    printf("值: 0x%x\n", num);
    printf("內(nèi)存布局(低地址->高地址):\n");
    
    for(int i = 0; i < sizeof(int); i++) {
        printf("地址 %p: 0x%x\n", p+i, *(p+i));
    }
    
    return 0;
}

在小端機器上輸出:

值: 0x12345678
內(nèi)存布局(低地址->高地址):
地址 0x7ffe...: 0x78  // 最低字節(jié)
地址 0x7ffe...: 0x56
地址 0x7ffe...: 0x34
地址 0x7ffe...: 0x12  // 最高字節(jié)

2.大端格式 (Big Endian)

  • 高字節(jié)存放在低地址
  • 低字節(jié)存放在高地址
  • 像PowerPC、網(wǎng)絡(luò)字節(jié)序使用大端
// 假設(shè)在大端機器上運行上述代碼,輸出為:
值: 0x12345678
內(nèi)存布局(低地址->高地址):
地址 0x7ffe...: 0x12  // 最高字節(jié)
地址 0x7ffe...: 0x34
地址 0x7ffe...: 0x56
地址 0x7ffe...: 0x78  // 最低字節(jié)

二、如何檢測大小端

方法1:使用聯(lián)合體

#include <stdio.h>

union EndianTest {
    int i;
    char c[sizeof(int)];
};

int isLittleEndian() {
    union EndianTest test;
    test.i = 1;
    return test.c[0] == 1;  // 如果最低地址字節(jié)是1,則是小端
}

int main() {
    if (isLittleEndian()) {
        printf("這是小端機器\n");
    } else {
        printf("這是大端機器\n");
    }
    return 0;
}

方法2:使用指針

int isLittleEndian() {
    int num = 1;
    return *(char *)&num == 1;
}

三、字節(jié)序轉(zhuǎn)換函數(shù)

網(wǎng)絡(luò)編程中經(jīng)常需要轉(zhuǎn)換:

#include <arpa/inet.h>  // Linux
// 或 #include <winsock2.h>  // Windows

uint32_t htonl(uint32_t hostlong);   // 主機->網(wǎng)絡(luò)(32位)
uint16_t htons(uint16_t hostshort);  // 主機->網(wǎng)絡(luò)(16位)
uint32_t ntohl(uint32_t netlong);    // 網(wǎng)絡(luò)->主機(32位)
uint16_t ntohs(uint16_t netshort);   // 網(wǎng)絡(luò)->主機(16位)

// 示例:
uint32_t host_value = 0x12345678;
uint32_t network_value = htonl(host_value);  // 轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序

四、什么情況下使用哪種格式

使用小端格式的情況:

  1. x86/x64架構(gòu)的CPU(Intel、AMD)
  2. ARM處理器(默認小端,可切換)
  3. Windows/Linux桌面系統(tǒng)
  4. 多數(shù)嵌入式系統(tǒng)
  5. 本地數(shù)據(jù)存儲(當不需要跨平臺時)

優(yōu)點:

  • 數(shù)學(xué)運算方便(從低字節(jié)開始處理)
  • 類型轉(zhuǎn)換簡單

使用大端格式的情況:

  1. 網(wǎng)絡(luò)協(xié)議(TCP/IP規(guī)定使用大端)
  2. PowerPC架構(gòu)
  3. 某些舊版SPARC、MIPS系統(tǒng)
  4. Java虛擬機內(nèi)部(大端)
  5. 圖像文件格式(如BMP、JPEG)
  6. 某些硬件設(shè)備的寄存器

優(yōu)點:

  • 人類閱讀友好(與書寫順序一致)
  • 容易判斷數(shù)值正負(符號位在最低地址)

五、實際應(yīng)用示例

示例1:網(wǎng)絡(luò)數(shù)據(jù)包解析

#include <stdio.h>
#include <stdint.h>

// 模擬從網(wǎng)絡(luò)接收的數(shù)據(jù)(大端格式)
void parseNetworkPacket(const uint8_t *packet) {
    // 前4字節(jié)是大端的IP地址
    uint32_t ip = (packet[0] << 24) | 
                  (packet[1] << 16) | 
                  (packet[2] << 8) | 
                  packet[3];
    
    // 使用ntohl轉(zhuǎn)換成本機字節(jié)序
    ip = ntohl(*(uint32_t*)packet);  // 更標準的做法
    
    printf("IP地址: %u.%u.%u.%u\n", 
           (ip >> 24) & 0xFF,
           (ip >> 16) & 0xFF,
           (ip >> 8) & 0xFF,
           ip & 0xFF);
}

示例2:文件格式處理

// 讀取BMP文件頭(大端格式)
#pragma pack(push, 1)
typedef struct {
    uint16_t signature;     // "BM",大端
    uint32_t fileSize;      // 大端
    uint16_t reserved1;
    uint16_t reserved2;
    uint32_t dataOffset;    // 大端
} BMPHeader;
#pragma pack(pop)

void readBMP(const char *filename) {
    FILE *file = fopen(filename, "rb");
    BMPHeader header;
    fread(&header, sizeof(header), 1, file);
    
    // 轉(zhuǎn)換字節(jié)序
    header.signature = ntohs(header.signature);
    header.fileSize = ntohl(header.fileSize);
    header.dataOffset = ntohl(header.dataOffset);
    
    fclose(file);
}

六、編寫跨平臺代碼的建議

  1. 使用標準轉(zhuǎn)換函數(shù)(htonl/ntohl等)
  2. 避免直接內(nèi)存拷貝不同字節(jié)序的數(shù)據(jù)
  3. 明確數(shù)據(jù)格式在文檔中說明
  4. 測試時考慮字節(jié)序
  5. 使用固定寬度整數(shù)類型(uint8_t, uint32_t等)
// 安全的字節(jié)序無關(guān)的讀取
uint32_t readUint32BigEndian(const uint8_t *buffer) {
    return (buffer[0] << 24) | 
           (buffer[1] << 16) | 
           (buffer[2] << 8) | 
           buffer[3];
}

uint32_t readUint32LittleEndian(const uint8_t *buffer) {
    return buffer[0] | 
           (buffer[1] << 8) | 
           (buffer[2] << 16) | 
           (buffer[3] << 24);
}

總結(jié)

  • 小端:低字節(jié)在低地址,常見于Intel CPU
  • 大端:高字節(jié)在低地址,用于網(wǎng)絡(luò)和某些硬件
  • 網(wǎng)絡(luò)通信必須使用大端
  • 本地存儲通常使用本機字節(jié)序
  • 跨平臺開發(fā)要注意字節(jié)序轉(zhuǎn)換

理解大小端對網(wǎng)絡(luò)編程、文件格式解析、硬件交互等至關(guān)重要!

到此這篇關(guān)于C語言大小端格式的文章就介紹到這了,更多相關(guān)C語言大小端格式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于"引用"的幾點說明介紹

    關(guān)于"引用"的幾點說明介紹

    引用聲明完畢后,相當于目標變量名有兩個名稱,即該目標原名稱和引用名,且不能再把該引用名作為其他變量名的別名
    2013-09-09
  • C++之BOOST字符串查找示例

    C++之BOOST字符串查找示例

    這篇文章主要介紹了C++之BOOST字符串查找的方法,實例演示了boost針對字符串的查找、判定及替換等操作,具有一定的實用價值,需要的朋友可以參考下
    2014-10-10
  • C++類和對象之相關(guān)特性解讀

    C++類和對象之相關(guān)特性解讀

    這篇文章主要介紹了C++類和對象之相關(guān)特性,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • C++實現(xiàn)連連看游戲核心代碼

    C++實現(xiàn)連連看游戲核心代碼

    這篇文章主要為大家詳細介紹了C++實現(xiàn)連連看游戲核心代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 手拉手教你如何理解c/c++中的指針

    手拉手教你如何理解c/c++中的指針

    當你對C越來越熟悉時,你會發(fā)現(xiàn)把與指針攪和在一起的"類型"這個概念分成"指針的類型"和"指針所指向的類型"兩個概念,是精通指針的關(guān)鍵點之一,這篇文章主要給大家介紹了關(guān)于c/c++中指針的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • C++實現(xiàn)大數(shù)相乘的算法

    C++實現(xiàn)大數(shù)相乘的算法

    這篇文章主要為大家詳細介紹了C++實現(xiàn)大數(shù)相乘的算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • C++內(nèi)存四區(qū)模型使用及說明

    C++內(nèi)存四區(qū)模型使用及說明

    C++內(nèi)存分為代碼區(qū)(只讀共享)、全局區(qū)(存全局/靜態(tài)變量及常量)、棧區(qū)(自動管理,存函數(shù)參數(shù)和局部變量)、堆區(qū)(手動管理,用new分配,delete釋放),各區(qū)域數(shù)據(jù)生命周期不同,提供靈活編程
    2025-09-09
  • C++常量詳解二(常量形參,常量返回值,常量成員函數(shù))

    C++常量詳解二(常量形參,常量返回值,常量成員函數(shù))

    這篇文章主要介紹了C++常量詳解二(常量形參,常量返回值,常量成員函數(shù)),需要的朋友可以參考下
    2017-06-06
  • C++實現(xiàn)LeetCode(166.分數(shù)轉(zhuǎn)循環(huán)小數(shù))

    C++實現(xiàn)LeetCode(166.分數(shù)轉(zhuǎn)循環(huán)小數(shù))

    這篇文章主要介紹了C++實現(xiàn)LeetCode(166.分數(shù)轉(zhuǎn)循環(huán)小數(shù))
    2021-07-07
  • C++中構(gòu)造函數(shù)的參數(shù)缺省的詳解

    C++中構(gòu)造函數(shù)的參數(shù)缺省的詳解

    這篇文章主要介紹了C++中構(gòu)造函數(shù)的參數(shù)缺省的詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-10-10

最新評論

太仆寺旗| 拜泉县| 青海省| 定西市| 抚顺市| 甘南县| 吕梁市| 永修县| 翼城县| 大姚县| 高台县| 来宾市| 灵璧县| 浠水县| 扎兰屯市| 宜兰县| 麻栗坡县| 资溪县| 杭州市| 子洲县| 丹寨县| 玉屏| 青州市| 盐源县| 柯坪县| 库伦旗| 遵义县| 灯塔市| 腾冲县| 广河县| 涞水县| 吉林省| 霍邱县| 界首市| 长泰县| 罗源县| 凤冈县| 沈丘县| 化德县| 高雄县| 鱼台县|