网络面试题:字节序?网络字节序和主机字节序?

一. 概念

字节序,就是 大于一个字节类型的数据在内存中的存放顺序。是在跨平台和网络编程中,时常要考虑的问题。

二.分类

字节序经常被分为两类:

  1. Big-Endian(大端):高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
  2. Little-Endian(小端):低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。

三.为什么要分大小端

这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。

四. 高低地址与高低字节

3.1 高低地址

C程序映射中内存的空间布局大致如下:

最高内存地址0xFFFFFFFF
栈区从高内存地址,往 低内存地址发展。即栈底在高地址,栈顶在低地址
堆区从低内存地址 ,往 高内存地址发展
全局区常量和全局变量
代码区
最低内存地址0x00000000

3.2 高低字节

在十进制中靠左边的是高位,靠右边的是低位,在其他进制也是如此。例如 0x12345678,从高位到低位的字节依次是0x12、0x34、0x56和0x78。

网络字节序 就是 大端字节序:4个字节的32 bit值以下面的次序传输,首先是0~7bit,其次8~15bit,然后16~23bit,最后是24~31bit

主机字节序 就是 小端字节序,现代PC大多采用小端字节序。

五、例子

对于数据 0x12345678,假设从地址0x4000开始存放,在大端和小端模式下,存放的位置分别为:
在这里插入图片描述

  • 采用Little-endian模式的CPU对操作数的存放方式是从低字节到高字节
  • 而Big-endian模式对操作数的存放方式是从高字节到低字节。

小端存储后:0x78563412 大端存储后:0x12345678

六. 如何判断大小端

那么问题来了,如何写程序判断机器的存储方式呢?(即“大端存储”还是“小端存储”)

例如:0x2345678在内存中是以78 56 34 12的方式存放的,可以看到变量i每个字节的内容,从而轻易的判断出它是小端存储。

写程序判断其实也是这样的思路:想办法取出一个字节的内容,就可以知道是哪种存储方式。比如,某个变量是4个字节,我们只要取出它的第一个字节内容,如果是78,则说明是小端存储;反之是大端。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值