今天刷C语言题的时候 遇到两道关于联合体输出的问题 一遍查资料一遍上机验证最后总结出一些简陋的经验;
写得比较通俗 可能有专业词汇用的不当 欢迎指正

情况一:(直接用题目数据 原理不变)(Turbo C

union
{unsigned char c;unsigned int i[4];//联合体z一共分配8个字节 z.c与z.i[0]同大小
}z;
z.i[0]=0x39;//16进制化成十进制 为57
z.i[1]=0x36;//16进制画成十进制 为54
printf("%c\n",z.c);//输出z.c=9(ACSII 9对应整数57)

0011 1001 0011 0110 z.c占前面八位
----z.i[0] -------z.i[1]-----

所以这里不用考虑大小端问题 因为我们要输出的z.c的大小和z.i[0]一致 不涉及到别的字节 输出z.c就相当于输出z.i[0];

情况二:(Turbo C

union
{int i;char c[2];//联合体一共占2个字节 x.i与x.c[0]+x.c[1]同大小
}x;
x.c[0]=10;
x.c[1]=1;
printf("%d\n",x.i);//输出x.i=266

0000 1010 0000 0001 x.i占整个联合体大小(16位)
----x.c[0] ------x.c[1]—

所以这里就会发生小端的现象 就是我们要求输出 x.i 时,x.i 的字节大小已经涉及到x.c[0]和x.c[1]两个部分 所以输出x.i 发生的小端模式使得最后输出:
0000 0001 0000 1010 相当于pow(2,8)+10=266
这里把x.c[1] 放前面了 是因为小端模式的特点:高字节放高地址 低字节放低地址

情况三:(C++实验)

#include<bits/stdc++.h>
using namespace std;
int main()
{union un {//c++ short两个字节 int 四个字节int c;//z.c的字节数相当于z.i[0]与z.i[1]字节数的和short i[4];//联合体z一共占8个字节 z.c占前面4个字节}z;z.i[0]=0x1;z.i[1]=0x100;//转化为十进制就是256int ans=pow(2,24)+1;//根据理论该得到的数据 下面会解释cout<<z.c<<endl;//实际z.c的数据cout<<ans<<endl;return 0;
}

这里肯定也是会发生小端的 z.c 的字节大小已经涉及到z.i[0]和z.i[1]两个部分
0000 0000 0000 0001 0000 0001 0000 0000
-----------z.i[0]=1 ------------------z.i[1]=256----
经过小端处理后 输出z.c会变成这种情况:
0000 0001 0000 0000 0000 0000 0000 0001
-----------z.i[1] -----------------------z.i[0]------
它的值应为pow(2,24)+1=16777217

notice:因为z.i[ ]属于short类型 所以每个元素都是两个字节 进行小端时 换是一起换两个字节 不是一个个字节换 !!!(应该是这样的 如果不是这样 那就会是下面这样输出)
0000 0000 0000 0001 0000 0001 0000 0000 =pow(2,16)+pow(2,8)=65792
但输出结果表示结论是正确的;

这里正确的输出是这样:

所以最后得出的结论就是:
对联合体某个元素 z.c 输出时:若z.c 的字节大小比后面单个元素大时 情况二和情况三这样 就要考虑小端的输出 高字节放高地址(其实就是反着拼字节再输出 先放z.i[1] 再放z.i[0]);若z.c的字节大小<=后面单个元素的字节大小时 情况一这样 就不用考虑这么多了 直接拿着z.c 所对应字节算就行了。
注意 小端换的时候 是根据z.i[ ]的字节数 而不是固定地以1个字节来换)

最后为了保证结论可靠 又做了个实验(跟情况一类似)(好像有点多余)

#include<bits/stdc++.h>
using namespace std;
int main()
{union un {short c;short i[4];}z;z.i[0]=0x1;z.i[1]=0x100;cout<<z.c<<endl;//输出1 return 0;
}

关于联合体输出的问题(是否小端模式)相关推荐

  1. 判断处理器是大端模式还是小端模式

    前言 这是一个古老而基础的问题,小代码,能够解决大问题.大框架的问题,就藏在小细节中.越大的框架,这种小细节藏的越深.为什么要区分大小端模式?难道不会有中端模式吗? 一 基本原理与内存图 下面的内存视 ...

  2. 借助联合体union的特性实现检测当前计算机环境采用的是大端模式还是小端模式

    方式一: 借助联合体union的特性实现(联合体类型数据所占的内存空间等于其最大的成员所占的空间,对联合体内部所有成员的存取都是相对于该联合体基地址的偏移量为 0 处开始,也就都是从该联合体所占内存的 ...

  3. 计算机大端模式和小端模式 内存对齐问题(sizeof)

    目录(?)[+] 一大端模式和小端模式的起源 二什么是大端和小端 三数组在大端小端情况下的存储 四为什么会有大小端模式之分呢 五如何判断机器的字节序 内存对齐问题 再讲讲pragma pack 内存对 ...

  4. 大端模式与小端模式的详解分析

    大端序与小端序 何为大端序,小端序? 简单点说,就是字节的存储顺序,如果数据都是单字节的,那怎么存储无所谓了,但是对于多字节数据,比如int,double等,就要考虑存储的顺序了.注意字节序是硬件层面 ...

  5. C语言之大端模式与小端模式

    大端模式与小端模式的定义(字节序) 大端模式:数据的高字节在低地址,低字节在高地址 小端模式:数据的高字节在高地址,低字节在低地址 怎么判断系统是大端模式和小端模式 首先来看两个知识点: (1)联合体 ...

  6. 677-大端模式和小端模式详解

    1.大端和小端核心是什么? 大端模式和小端是实际的字节顺序和存储的地址顺序对应关系的两种模式,总结如下: 大端模式:低地址对应高字节 小端模式:低地址对应低字节 不管是大端还是小端模式,我们在读取和存 ...

  7. 大端模式小端模式详解(不懂你打我,略略~~)

    大端模式小端模式详解(不懂你打我,略略~~) 先看概念 大端模式(Big-Endian),是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作 ...

  8. 计算机中的大端模式与小端模式

    1.小端模式 小端模式:数据的高字节保存在内存的高地址中:数据的低字节保存在内存的低地址中.默认使用小端模式 2.大端模式 大端模式:数据的高字节保存在内存的低地址中:数据的低字节保存在内存的高地址中 ...

  9. 【转】大端模式与小端模式、网络字节顺序与主机字节顺序 (经典)

    大端模式与小端模式 一.概念及详解 在各种体系的计算机中通常采用的字节存储机制主要有两种: big-endian和little-endian,即大端模式和小端模式. 先回顾两个关键词,MSB和LSB: ...

最新文章

  1. 再谈JSON -json定义及数据类型
  2. 成功有感之给年轻人的10个忠告
  3. 重写修改重写的Dialog显示问题
  4. linux查看安装的所有内核,Linux怎么查看系统已安装内核
  5. 用神经网络做分子模型是不是扯淡,f2,cl2,br2分子模型
  6. 台式计算机属于,pc机属于什么型计算机
  7. 融合、协同系统的边缘云原生架构演进和实践
  8. angularJs跨域
  9. 认清SQL_Server_2005的基于行版本控制的两种隔离级别
  10. asp.net core中使用log4net
  11. linux telnet mysql_Linux下安装telnet(傻瓜教程)
  12. OpenCV-Python中的简单数字识别OCR
  13. kali2021安装RTL8188GU无线网卡[TL-WN726N]驱动
  14. Lick the habit 戒除恶习
  15. 客户细分是客户关系管理的重要手段
  16. 防用户误删除,耗费一周时间把DeleteMark标志都加上来了,所有的删除操作从“物理删除”转为“逻辑删除”
  17. 最好的贵人,是努力的自己
  18. 女生应该怎样心疼自己的男朋友?
  19. C语言指针(二重指针)
  20. 如何禁止IE浏览器访问我的网页

热门文章

  1. PHP Yii2 composer环境安装
  2. Spring的一种拦截器SimpleUrlHandlerMapping
  3. WPF 之 鼠标双击事件
  4. JavaWeb之Servlet入门(一)
  5. nsis 固定到任务栏
  6. Mysql数据库及帐号的权限查询
  7. mapreduce排序比较器的选取
  8. 软件保护技术--- 常见保护技巧
  9. 【nginx】关于fastcgi_cache
  10. 编译指令#pragma详解