咖啡seo是什么意思,苏州关键词优化排名推广,济南国画网站建设,品牌建设的最高境界是培育客户成为大端模式、小端模式
一、什么是字节序
字节序#xff0c;就是字节的顺序#xff0c;即大于一个字节类型的数据在内存中的存放顺序。
在跨平台以及网络程序中字节序 应被考虑。
字节序分为两类#xff1a;Big-Endian和Little-Endian#xff0c;
引用标准的Big-Endian和…大端模式、小端模式
一、什么是字节序
字节序就是字节的顺序即大于一个字节类型的数据在内存中的存放顺序。
在跨平台以及网络程序中字节序 应被考虑。
字节序分为两类Big-Endian和Little-Endian
引用标准的Big-Endian和Little-Endian的定义如下
a) Little-Endian就是低位字节放在内存的低地址端高位字节排放在内存的高地址端。
b) Big-Endian 就是高位字节放在内存的低地址端低位字节排放在内存的高地址端。
c) 网络字节序TCP/IP各层协议将字节序定义为Big-Endian
1.1 什么是高/低地址端
有关于内存空间布局情况的说明大致如下图
----------------------- 最低内存地址 0x00000000 ----------------------- 最高内存地址 0xf f f f f f f f
由图可以看出内存分布中
栈由高地址向低地址存放
堆由低地址向高地址存放
1.2 什么是高/低字节
低位字节为最低有效位高位字节为最高有效位。
在十进制中靠左边的是高位靠右边的是低位在其他进制也是如此。
拿0x12345678来说从高位到低位的字节依次是0x12、0x34、0x56和0x78。
以unsigned int value 0x12345678为例
用unsigned char buf[4]来表示value
Big-Endian: 低地址存放高位大端
栈底 高地址 --------------- buf[3] (0x78) -- 低位
buf[2] (0x56)
buf[1] (0x34)
buf[0] (0x12) -- 高位 ---------------栈顶 低地址Little-Endian: 低地址存放低位小端
栈底 高地址 ---------------
buf[3] (0x12) -- 高位
buf[2] (0x34)
buf[1] (0x56)
buf[0] (0x78) -- 低位 --------------栈 顶 低地址
二、Big-Endian和Little-Endian优缺点
Big-Endian优点 首先提取高位字节可以由看看在偏移位置为0的字节来确定这个数字是正数还是负数。不必知道这个数值有多长或者你也不必通过一些字节来看这个数值是否含有符号位。这个数值是以它们被打印出来的顺序存放的所以从二进制到十进制的函数特别有效。因而对于不同要求的机器在设计存取方式时就会不同。
Little-Endian优点 提取一个两个四个或者更长字节数据的汇编指令以与其他所有格式相同的方式进行首先在偏移地址为0的地方提取最低位的字节因为地址偏移和字节数是一对一的关系多重精度的数学函数就相对地容易写了。
三、请写一个C函数判断CPU是大端模式还是小端模式
若处理器是Big_endian的则返回0若是Little_endian的则返回1。
#includestdio.hint checkCPU()
{union{int a;char b;}c;c.a 1;return (c.b 1);
}int main()
{printf(%d\n, checkCPU());return 0;
}
我的电脑 打印结果 : 小端模式 记住 正常的一串数字 左边是高字节 右边是低字节
举例一个16进制数是 0x11 22 33其存放的位置是
地址0x3000 中存放11
地址0x3001 中存放22
地址0x3002 中存放33
连起来就写成地址0x3000-0x3002中存放了数据0x112233
这种存放和表示方式正好符合大端。
代码
#includeiostreamusing namesoace std;bool checkCPU() // 如果是大端模式返回真
{ short int test 0x1234; if( *((char *)test) 0x12) // 低地址存放高字节数据 return true; else return false;
} int main()
{ if( !checkCPU()) coutLittle endianendl; else coutBig endianendl; return 0;
} 或者
#includeiostreamusing namespace std;int main()
{short int a 0x1234;char *p (char*)a;if (*p 0x34){cout Little endian endl;}else{cout Big endian endl;}return 0;
} 或者
#includeiostreamusing namespace std;int main()
{short int a 0x1234;char x0, x1;x0 ((char*)a)[0];x1 ((char*)a)[1];if (x0 0x34){cout Little endian endl;}else{cout Big endian endl;}
} 大小端模式的转换
#includestdio.hint swap(int n)
{n (((n 0xff000000) 24) | ((n 0x00ff0000) 8) | ((n 0x0000ff00) 8) | ((n 0x000000ff) 24));return n;
}int main()
{int m 0x12345678;printf(0x%x\n, m);printf(0x%x\n, swap(m));return 0;
} 参考链接https://blog.csdn.net/free377096858/article/details/90513968