C/C++字节序(大端/小端)判断

C/C++大端小端判断

说的是变量的高字节、低字节在内存地址中的排放顺序。

变量的高字节放到内存的低地址中(变量的低字节放到内存的高地址中)==>大端
变量的高字节放到内存的高地址中(变量的低字节放到内存的低地址中)==>小端

例如,对于int类型变量x=0x30313233,在x86下,考虑到在内存中是按照字节为单位进行数据排布,那么会把0x30,0x31,0x32,0x33这4个值按照某种顺序(大端或者小端)进行存储:从0x30到0x33依次为变量的高字节到低字节,如果是大端字节序存储,则从低内存地址到高内存地址,依次存放:0x30, 0x31, 0x32, 0x33;如果是小端字节序存储,则从低内存地址到高内存地址,依次存放:0x33, 0x32, 0x31, 0x30(用这几个蛋疼的16进制数字,是为了后续强转为char类型并打印的方便而考虑的):

写个代码验证下:

void test_little_or_big_endian() {
    int x;
    cout << "sizeof(int) is " << sizeof(int) << endl;
    char x0, x1, x2, x3;
    x = 0x30313233;
    cout << *((char*)&x) << endl;
    x0 = ((char*)&x)[0];
    x1 = ((char*)&x)[1];
    x2 = ((char*)&x)[2];
    x3 = ((char*)&x)[3];

    cout << "x0=" << x0 << endl;
    cout << "x1=" << x1 << endl;
    cout << "x2=" << x2 << endl;
    cout << "x3=" << x3 << endl;
    /*
    对于小端序,输出
    x0=3
    x1=2
    x2=1
    x3=0   //0x30对应到十进制的48,也即是ascii的'0',作为char类型输出显示为0
    */
}
时间: 2024-10-26 19:41:43

C/C++字节序(大端/小端)判断的相关文章

《操作系统真象还原》——0.19 什么是大端字节序、小端字节序

0.19 什么是大端字节序.小端字节序 先说一下为什么会产生字节序的问题. 内存是以字节为单位读写的,其最小的读写单位就是字节.故如果在内存中只写入一个字节,一个内存的存储单元便可将其容纳了,只要访问这一内存地址就能够完整取出这1字节.可是1字节要能够表示的范围只有0-255(先只考虑无符号数),超过这个范围的数,只好用多个字节连在一起来表示.因此,在我们的32位程序中,定义的数据类型很多.1字节的数据类型只有char型,像int型要占4字节,double型要占用8字节.正如解决了一个问题又抛出

vb.net 网络通信--网络字节顺序采用小端

问题描述 请问用vb.net实现网络通信是否要考虑网络字节顺序采用小端和大端.如果要考虑的话在vb.net中如何去实现.本人对通信这块小白,请各位不吝赐教. 解决方案 解决方案二: 解决方案三:一般是不需要考虑的.只有当你的通信另一方是LINUX之类的其它操作系统,采用的又是非标准协议时,才需要考虑.解决方案四:引用2楼rtdb的回复: 一般是不需要考虑的.只有当你的通信另一方是LINUX之类的其它操作系统,采用的又是非标准协议时,才需要考虑. 感谢你的回答,你说的非标准协议是指除socket(

c语言-大端小端的存储问题,牵涉到数组和指针,C语言

问题描述 大端小端的存储问题,牵涉到数组和指针,C语言 #include int main() { int a[i]; printf("%x ",a); int *p=a; *p=0x12345678; return 0; } 若下面程序运行结果为bfae4d68,a[0]以大端模式如何存储,以小端模式如何存储,请用内存结构示意图表示. 有点不太了解它的内存方式 解决方案 C语言数组,指针,函数等问题 解决方案二: 我不知道他们的内存到底是如何分配的 解决方案三: 比如是一个字节,内存

大端小端对位域成员存放的影响

问题描述 大端小端对位域成员存放的影响 大端小端对位域成员存放的影响 1)低字节都存放在低地址 2)大端模式首先为字段的高bit位分配空间,小端模式首先为字段的低bit位分配空间 3)大端模式首先存放在地址的高bit位,小端模式首先存放在地址的低bit位 这几句话应该怎么理解呢? 解决方案 首先明确一下,内存区域地址是递增的. 例如: 00 01 02 03 04 05 06 07 ---------------------------->递增--> 假如 数据: 0X87654321 将它存

大端小端 说明

1.引入 计算机的字长一直在增长,从4位开始,经过8.16.32.64位,以后可能还会有更多的位出现.现在的计算机还都是以字节(即8个bit位)作为地址编址单元. 编程语言中有许多内置的数据类型,有整型,浮点型等.每种内置类型所占用的字节数是不相同的. 大端小端就是指在一个内置数据类型中,数据的存放顺序,分为两种,即小端优势和大端优势. 2.概念 大端优势:数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中 小端优势:数据的低字节存储在低地址中,而字数据的高字节则存放在高地址中(所谓的

关于IBM问题?求个指教请问怎么用代码实现来判断计算机室IBM的存储还是IEEE的存储,是大字节序还是小字节序

问题描述 请问怎么用代码实现来判断计算机室IBM的存储还是IEEE的存储,是大字节序还是小字节序? 解决方案

C++ 大端小端

小端(高位存在高地址,低位存在低地址)\ union      {           long    Long;       char    Char[sizeof(long)];     }u;          bool    IsBigOrSmall()    //    1-小端(Intel);    0-大端(Motor)     {         u.Long    =    1;         if(    u.Char[0]    ==    1    )         

C++:小端模式与强制数据类型转换

1.先从一个问题说开去 C++数据类型转换的问题 #include <iostream.h> void main() { int i=0xb62; char c; c=i; cout<<c<<endl; } 这里为什么输出的是b? 2.先检测一下我们所使用的电脑的CPU的字节序 版本一(有问题,结果无论如何都是34,不能说明34是高地址的还是低地址的) 版本二(根据 shineyan1991的留言修改后得到的,在此谢谢 shineyan1991的建议) 从上图可知,CP

理解字节序

1. 计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian). 举例来说,数值0x2211使用两个字节储存:高位字节是0x22,低位字节是0x11. 大端字节序:高位字节在前,低位字节在后,这是人类读写数值的方法. 小端字节序:低位字节在前,高位字节在后,即以0x1122形式储存. 同理,0x1234567的大端字节序和小端字节序的写法如下图. 2. 我一直不理解,为什么要有字节序,每次读写都要区分,多麻烦!统一使用大端字节序,不是更方便吗?