字节序,内存对齐

字节序

  • 大端字节序是指一个整数的最高位字节(23 ~ 31 bit)存储在内存的低地址处,低位字节存储在内存的高地址处;
  • 小端字节序则是指整数的高位字节存储在内存的高地址处,而低位字节(0 ~ 7 bit)则存储在内存的低地址处。

我们常见的主机字节序为小端字节序,而网络字节序为大端模式

字节序转换函数

#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);         //主机字节序 -- 网络字节序
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);          //网络字节序 -- 主机字节序
uint16_t ntohs(uint16_t netshort);

h表示host,n表示network,l表示32位长整数,s表示16位短整数。

大小端判断

一般主机字节序为小端模式,数据低地址指向内存低地址,数据高地址指向内存高地址
判断原理:利用union的特性,2个变量公用一块内存空间,并且2个变量的首地址相等

#include <bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0)
#define int long long

typedef long long ll;
const int mod = 1e9 + 7;
//判断字节序大小端
union
{
	int num;
	char a; // 2个变量公用一块内存空间,并且2个变量的首地址相等
} b;
void solve()
{
	b.num = 1;
	cout << ((b.a == 1) ? "小端" : "大端") << "\n";
}

signed main()
{
	//freopen("walk.in", "r", stdin);
	//freopen("walk.out", "w+", stdout);
	IOS;
	int T = 1;

	while (T--)
	{
		solve();
	}
	return 0;
}

内存对齐

内存对齐,也称为字节对齐,存在的意义在于CPU访问数据的一个效率问题,假如数据不对齐,变量需要多次访问内存,这与CPU内存地址契合性有关;字节对齐之后,只需要一次就可以取出数据。字节对齐还可以有效的节省存储空间,也与编译器GUN有关。

例子

 struct test{ 
   int a;     // 4/4->4
   char ch;   //1/4->1
 } ;

按理分析,结构体大小为5,但实际为8,这就是用到了字节对齐,
补全3个字节后的值能被结构体中的所有变量整除。

再来一道~

struct S{
	double d; //8/8->8
	char c; //1/8->1
	int i; //4/8->4
};

结构体大小为16,这是通过字节对齐补全后的实际大小,补全后的值能被结构体中的所有变量整除。
在这里插入图片描述

IP地址

IP地址:IP协议为互联网上的每一个网络和每一台主机分配的一个逻辑地址
在这里插入图片描述

特殊的网址

  • 每一个字节都为0的地址(“0.0.0.0")对应于当前主机;

  • IP地址中的每一个字节都为1的IP地址(“255.255.255.255")是当前子网的广播地址;

  • IP地址中凡是以“11110”开头的E类IP地址都保留用于将来和实验使用。

  • IP地址中不能以十进制“127”作为开头,该类地址中数字127.0.0.1到127.255.255.255用于回路测试,如:127.0.0.1可以代表本机IP地址。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Q_Outsider

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值