判断大小端字节序

字节序

顾名思义,就是内存中存储字节的顺序。一种是起始地址存储低序字节,叫 little-endian 小端字节序。另一种是起始地址存储高序字节,叫 big-endian 大端字节序。

判断大小端程序
#include <stdio.h>
#define CPU_VENDOR_OS "Ubuntu 18.04"

int main(int argc, char **argv)
{
    union {
        short s;
        char c[sizeof(short)];
    }un;

    un.s = 0x0102;
    printf("%s: ", CPU_VENDOR_OS);
    if(sizeof(short) == 2) {
        if(un.c[0] == 1 && un.c[1] == 2) {
            printf("big-endain\n");
        }
        else if(un.c[0] == 2 && un.c[1] == 1) {
            printf("litle-endain\n");
        }
        else {
        	printf("unknown\n");
        }
    }
    else {
    	printf("sizeof(short) = %ld\n", sizeof(short));
    }
    return 0;
}
### C++ 中处理小端字节序的方法 在C++中,可以通过条件编译的方式检测当前系统的字节序是否为小端,并据此编写相应的代码逻辑。对于POSIX兼容的系统,`endian.h`头文件提供了方便的宏定义用于判断字节序[^1]。 当确认环境采用的是小端模式后,在实际的数据操作过程中,如果涉及到跨平台通信或是读取特定格式的小端编码二进制流,则需确保按照该方式解析或构建数据结构。例如: ```cpp #include <iostream> #include <cstring> // for memcpy using namespace std; struct LittleEndianData { uint32_t value; void set_value(uint8_t b1, uint8_t b2, uint8_t b3, uint8_t b4){ // 构建一个uint32_t类型的数值,假设输入参数是以小端形式给出的各个字节 this->value = (static_cast<uint32_t>(b1)) | (static_cast<uint32_t>(b2) << 8) | (static_cast<uint32_t>(b3) << 16) | (static_cast<uint32_t>(b4) << 24); } }; int main(){ #if __BYTE_ORDER == __LITTLE_ENDIAN cout << "System is little-endian." << endl; #else cout << "This code assumes a little-endian system but the current one isn't!" << endl; #endif LittleEndianData data; data.set_value(0x78, 0x56, 0x34, 0x12); // 假设这是来自某个外部源的一组按小端排列的字节 printf("Interpreted as integer on this platform: %u\n", data.value); return 0; } ``` 上述程序展示了如何在一个已知为小端架构下的环境中创建并解释由四个字节组成的一个无符号整数。这里的关键在于理解每个字节的位置关系——即最低有效位位于最左边(对于小端而言)。此外还应注意不同平台上基本类型大小可能存在的差异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Caso_卡索

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值