2020-09-18 14:21:13 登录注册 RSS

当前位置: 公理网 >> 曝光信息 >> 利用联合体判断字节序

利用联合体判断字节序
发布时间:02-18| 来源:公理网 | 点击发表评论


由于联合体变量存储的原因,可以借助这一特性来判断计算机中字节序是大端还是小端。

大端:值的高位存储在内存的低地址处,低位存储在高地址处
20191011180505828.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNzYzMzQ0,size_16,color_FFFFFF,t_70"alt="在这里插入图片描述">

----下面是小端字节序存储方式
小端:值的高位存储在内存的高地址处

20191011180805642.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNzYzMzQ0,size_16,color_FFFFFF,t_70"alt="在这里插入图片描述">
图画的有点丑啊,如果理解不了,就死记住:大端字节序的读取顺序是符合人类常规,是从右往左读,但是小端字节序是反的,也就是从右往左的,大部分的计算机都是小端字节序的,由于网络传输的字节大都是大端类型,所以这也就引出了小端和大端之间的转换。

下面是利用联合体的特性判断,这个特性就是在联合体中,变量总是从低地址中存储如下图:
20191011174540144.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNzYzMzQ0,size_16,color_FFFFFF,t_70"alt="在这里插入图片描述">
这也就是联合体和结构体的区别之处,联合体最后所占的字节数是它最大的变量所占的字节数,因为所有的变量都共享一块内存,没有内存对齐这一说法。

然后我们可以给int变量赋值为1或者其他数都可以,如下图:
20191011182319514.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNzYzMzQ0,size_16,color_FFFFFF,t_70"alt="在这里插入图片描述">
当把int变量赋值的同时,其实把char变量也赋值了,上面显示的是小端字节序,因为char变量值为78,但是如果char变量为12的,就说明int变量在内存中的存储位置是12345678" target="_blank" title="查看12345678的资料">12345678,那么char变量的值自然也就是12了,因为他们是共享内存的。
[两个数字占一个字节]

uniontemp{inta;charb;}temp;intmain(){temp.a=0x1234567;//低位存储在低地址if(temp.b==0x67){printf("小端模式\n");}//高位存储在低地址else{printf("大端模式\n");}return0;}方法二

inta=1;
if(*(char*)a==1){
cout"小端模式"endl;
}else{
cout"大端模式"endl;


解释如下:

20191011183715635.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNzYzMzQ0,size_16,color_FFFFFF,t_70"alt="在这里插入图片描述">

赋值16进制的数字


inta=0x12345;
if(*(char*)a==0x45){
cout"小端模式"endl;
else{
cout"大端模式"endl;


下面是内存分布图

201910111845276.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNzYzMzQ0,size_16,color_FFFFFF,t_70"alt="在这里插入图片描述">


授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!

授予每个自然周发布7篇到8篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。

最新新闻

手机浏览

公理网 版权所有

公理网 Total 0.041041(s) query 6, 报料QQ:点击这里

给我发消息