理解字节序

大端/小端字节序

计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian)。

举例来说,数值0x2211使用两个字节储存:高位字节是0x22,低位字节是0x11。

  • 大端字节序:低地址端存放高位字节,这是人类读写数值的方法。
  • 小端字节序:低地址端存放低位字节。

同理,0x1234567的大端字节序和小端字节序的写法如下图:
在这里插入图片描述

计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的本机字节序基本都是小端字节序。但是,人类还是习惯读写大端字节序。所以,除了计算机的内部处理,其他的场合几乎都是大端字节序,比如网络传输和文件储存

字节序转换函数

最常用的大小端转换函数:

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位短整数。

注意:32位是用来转换IP地址的,16位是用来转换端口号的

判断Linux字节序的方法

#include<stdio.h>
int main()
{
	int a = 1;   //a的十六进制位是0x00000001,所以容易取出并进行判断
	char* p = &a;//对p解引用时只是拿到a的第一个字节的内容
	if (*p == 1) //如果是小端,那么第一个字节就是01
	{
		printf("小端储存模式\n");
	}
	else         //如果是大端,那么第一个字节为00
	{
		printf("大端储存模式\n");
	}
	return 0;
}

string有字节序的说法吗

没有,字节序是指byte的排序,string里面都是char,一个char就是1字节,只要出现索引的地方,一定是索引越大地址越大。

64位系统和32位系统的区别

  1. 处理能力不同。64位可以一次性处理8个字节的数据量,而32位一次性只可以处理4个字节的数据量,因此64位比32位的运行能力提高了一倍。
  2. 内存寻址不同。64位最大寻址空间为2的64次方,理论值直接达到了16TB,而32位的最大寻址空间为2的32次方,为4GB,换而言之,就是说32位系统的处理器最大只支持到4G内存,而64位系统最大支持的内存高达亿位数。
  3. 运行软件不同。由于32位和64位CPU的指令集是不同的。所以需要区分32位和64位版本的软件。一般来说最广泛使用的intelx86是源于很久以前的80x86系列处理器,从80386开始就是32位的CPU,也对应的32位指令集。intel后来的所有32位CPU都使用了这一套指令集。再后来发展到64位CPU,从x86扩展出64位的指令集,一般被称为x64。为了保证兼容性,intel使得在其64位CPU上也能运行老的32位x86指令。于是实际上我们可以在64位CPU上运行32位程序,但是反过来不行。简而言之就是64位的操作系统可以兼容运行32位的软件,反过来32位系统不可以运行64位的软件。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值