一.字节顺序的产生

在计算机中,数据是以字节为单位存放的,而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. 一款信息收集工具-theHarvester

    用法: theHarvester -d 163.com -l 1000 -b baidutheHarvester -d 163.com -l 1000 -b google -d 后跟服务器域名     ...

  2. BZOJ5509: [Tjoi2019]甲苯先生的滚榜

    题解 开n个平衡树对每个AC数维护罚时,然后不同AC数用树状数组维护即可. 其实挺好写的...就是评测的时候评的巨久... #include <bits/stdc++.h> using n ...

  3. python tkinter txt窗口,开线程两个卡死

    一个线程可以,两个卡死 #!/usr/bin/python # coding: utf-8 from Tkinter import * import threading class MyThread2 ...

  4. django-支付宝支付

    安装python-alipay-sdk pip install python-alipay-sdk --upgrade 配置 视图函数orders/views.py # 订单支付 # /order/p ...

  5. abp radio表单元素 消失了

    框架将原本的元素都隐藏掉了,取而代之的是根据label定义了自己的样式,如下: [type="radio"]:not(:checked)+label {    padding-le ...

  6. OpenCV 学习笔记(2) 使用鼠标绘制矩形并截取和保存矩形区域图像

    http://www.cnblogs.com/lidabo/p/3437587.html 0 效果展示 1工程源码 #include <opencv2/core/core.hpp>   # ...

  7. ES6 let 和const

    一.var 的缺陷:var 只有全局作用域和函数作用域,没有块级作用域,除了在函数内部的变量默认都属于window var foo='hello'; fn=function(){ var foo='w ...

  8. RFM客户价值分类

    # 自定义好的包,亲测可用 原数据和代码思想来自以下网址 # https://github.com/joaolcorreia/RFM-analysis import datetime as dt im ...

  9. 【转】为什么我们做分布式使用Redis?

    绝大部分写业务的程序员,在实际开发中使用 Redis 的时候,只会 Set Value 和 Get Value 两个操作,对 Redis 整体缺乏一个认知.这里对 Redis 常见问题做一个总结,解决 ...

  10. codeblock代码片段

    for循环 ; $(index name)<| ; $(index name)++ ){ } 2. 反向for循环 ; $(index name)>= ; $(index name)-- ...