字节序
- 大端字节序是指一个整数的最高位字节(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地址。