一.字节顺序的产生

在计算机中,数据是以字节为单位存放的,而c语言中只有char才是一个字节,其他如int,float都是大于一个字节,所以就存在将数据按怎样的顺序存放的问题。一般有大端序和小端序两种方式,特殊的还有混合序,也就是两种存放方式同时存在于一个计算机系统中。

上面讲的都是主机字节顺序。

网络字节顺序是指在网络中传输数据的所遵循的字节顺序。TCP/IP采用的是大端序。

二.大端序和小端序

大端序是指数据的低位保存在高地址,数据的高位保存在低地址。对于0X1122,采用大端序进行保存,则如左图所示

小端序是指数据的低位保存在低地址,数据的高位保存在高地址。对于0X1122,采用小端序进行保存,则如右图所示

在linux下可以采用下面的程序段知道它所采用的字节顺序:

    #include<iostream>
using namespace std;
int main(void)
{
int num=0x12345678;
char *p=(char *)#
if(*p==0x12&&*(p+)==0x34)
cout<<"linux采用大端序"<<endl;
else
cout<<"linux采用小端序"<<endl;
}

三.数据对齐

1.产生的原因

CPU为了高效的读取数据,要求数据的存放的起始地址是它所占用空间的整数倍。例如,一个double型变量,如果存放的起始地址不是8的整数倍,那么就要两次读取访问内存,而如果起始地址是8的倍数,只需要一次访问内存。

2.自然对齐

i.各成员变量存放的地址相对于结构的起始地址的偏移量为sizeof(类型)或其整数倍。

ii.结构的总大小是其成员中最大类型的sizeof(该类型)整数倍。

所以在定义结构体时最好把结构中的变量按照类型大小从小到大声明,以减少中间的填补空间。

3.强制对齐

强制对齐是程序员通过#pragma pack(n) 设定对齐系数。

如果n大于等于结构体中最大成员所占的空间,那么就跟自然对齐是一样的效果;

如果n小于结构体中最大成员所占的空间,那么每个成员如果不必按最大成员所占空间对齐,只需要按n对齐就可以。最终结构体的大小必然是n的整数倍。

字节顺序&字节对齐的更多相关文章

  1. 顶级c程序员之路 选学篇-1 深入理解字节,字节序与字节对齐

     深入理解字节,字节序与字节对齐 一 总述 作为一个职业的coder玩家,首先应该对计算机的字节有所了解. 我们经常谈到的2进制流,字节(字符)流,数据类型流(针对编程),结构流等说法,2进制流,0和 ...

  2. 基于X86平台的PC机通过网络发送一个int(32位)整数的字节顺序

    1.字节顺序 字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端.大端两种字节顺序.小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处:大端字节序是高字节数据存 ...

  3. [转]android开发之字节顺序

    原文在此 android上C++程序为小端字节顺序,和windows上一样. 而android上的JAVA程序则使用的是大端字节顺序. 用NDK和java SDK 做android程序时发现的问题,记 ...

  4. 字节顺序重置及“#include <algorith.h>”相关的STL最重要的头文件提醒

    这两天在写一个程序,需要将二进制文件中的数据以指定结构读入内存,说明文档中有提到大端序和小端序(Big Endian or Little Endian) 的概念,就找了一下字节顺序重置的算法,在一篇名 ...

  5. Java中如何判断当前环境是大端字节顺序还是小端字节顺序

    Java非字节类型的基本类型,除了布尔型都是由组合在一起的几个字节组成的.这些数据类 型及其大小总结在表 2-1 中. 表:基本数据类型及其大小 数据类型 大小(以字节表示) Byte 1 Char ...

  6. 字节顺序标记——BOM,Byte Order Mark

    定义 BOM(Byte Order Mark),字节顺序标记,出现在文本文件头部,Unicode编码标准中用于标识文件是采用哪种格式的编码.     介绍 UTF-8 不需要 BOM,尽管 Unico ...

  7. BOM (字节顺序标记)

    BOM(Byte Order Mark):字节顺序标记,出现在文本文件头部,Unicode编码标准中用于标识文件是采用哪种格式的编码. 注:计算机内部数据存储都是二进制的,只有知道一段数据的二进制存储 ...

  8. 字节顺序:高位优先(big-endian)和低位优先(little-endian)

    网络字节序: MSB 高字节前存法 Most Significant Bit   (Big Edian) 主机字节序: LSB 低字节前存法 Lest Significant Bit  (Little ...

  9. 字节顺序标记BOM

    最近,从numbers导出的csv文件,导入excel后,出现中文乱码问题.网上查询后,发现是numbers导出的csv默认是utf-8无BOM的,使用sublimText3打开,另存为utf-8wi ...

随机推荐

  1. Linux系统的时间比北京时间慢12个小时的处理方案(将EDT时区改为CST)

    今天查看Linux操作系统的时间,发现比正常时间慢12个小时整,感觉很奇怪,后来使用ntp服务器校对时间发现也是不管用的,还是慢12个小时.之前遇到过是慢8个小时,但是我知道是因为使用的是UTC时间, ...

  2. React源码 React ref

    ref 的功能,在 react 当中.我们写了一个组件,在这个时候,我们的 render function 里面我们会渲染一系列的子组件或者 dom 节点,有时候我们会希望有这样的需求,就是我们要获取 ...

  3. 删除或关闭Word中的超链接

    最近使用的word老是会把一些文字内容或者标题转换成乱七八糟的格式,看的莫名其妙的,找了好久也不知道什么问题,后来一查才知道是因为这些文字包含超链接,word自动转换了...你说是不是莫名其妙. 要关 ...

  4. python与设计模式--单例模式

    https://zhuanlan.zhihu.com/p/31675841 设计模式分类 创建类 单例模式.工厂模式.抽象工厂模式.原型模式.建造者模式 结构类 装饰器模式.适配器模式.门面模式.组合 ...

  5. rsa 解密过程

    直接扣js代码 $w = {}; if (typeof $w.RSAUtils === 'undefined') var RSAUtils = $w.RSAUtils = {}; var biRadi ...

  6. 使用idea创建项目如何忽略iml文件

    在图中圈出的输入栏中输入“*.iml;”,点下OK就可以了,如图进入idea项目窗口,如图 点下file,进入file菜单窗口,如图 点下settings,进入到settings窗口,如图 在输入框f ...

  7. 后端将Long类型数据传输到前端出现精度丢失的问题

    当将超过16位的数字传输到前端的时候,就会出现精度丢失的问题,然后我按照网上的几种方法实验的时候,只有一种方法成功了.可能是因为环境等方面的问题. 我这里成功是因为:最后使用的是配置mvc的方式,然后 ...

  8. oracle安装11g以及建账号等等

    Oracle 11g安装步骤详解 一.Oracle 下载 注意Oracle分成两个文件,下载完后,将两个文件解压到同一目录下即可. 路径名称中,最好不要出现中文,也不要出现空格等不规则字符. 官方下地 ...

  9. oc语言的特征

    类型结构+运行时 内存管理:引用计数与析构 并发:gcd 函数式:block

  10. 11.06水题Test

    11.06水题比赛 题目 描述 做法 \(BSOJ5150\) 求\(n\)个数两两之差的中位数 二分中位数,双指针判定\(\le x\)差值对数 \(BSOJ5151\) 求树的最大匹配和其个数 来 ...