程序员应了解的那些事(1)大小端、网络字节序、LSB,MSB

<1>大小端的概念
大小端的问题主要是由计算机内存中多字节形数据类型的存在而引起的,他的研究单位是字节,对于char行数据类型,就是一个字节,八位,是不存在大小端问题的;但是对于short、int、float等数据类型,表示一个数据需要多个字节,那么这多个字节之间的顺序就十分重要了。
Big-Endian和Little-Endian的定义如下:
Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

①大端模式://符合正常读写思维
低地址 -----------------> 高地址
0x12 | 0x34 | 0x56 | 0x78

②小端模式:
低地址 ------------------> 高地址
0x78 | 0x56 | 0x34 | 0x12
③举例如下:

④大端小端没有谁优谁劣,各自优势便是对方劣势:
   大端: ※符号位在所表示的数据的内容的第一个字节中,便于快速判断数据的正负(offset(0))和大小。
   小端:易于进行数据类型转换,1、 2、 4字节的存储方式一样。
              ※低地址放低字节,所以在强制转换时不需要调整字节的内容
              ※CPU做数值运算时从内存中依次从低到高取数据进行运算直到最后刷新最高位的符号位,这样运算方式会更高效

 PS:通常情况下,Interl x86系列芯片使用小端存储模式;
           ARM的芯片默认小端,但可以切换到大端;
           网络上普遍采用大端模式,使用大端的CPU: power pc 、DSP … …

⑤数组在大端小端情况下的存储
以unsigned int value = 0x12345678为例,分别看在两种字节序下其存储情况,我们可以用unsigned char buf[4]来表示value。

<2>网络字节序
       网络上传输的数据都是字节流,对于一个多字节数值,在进行网络传输的时候,先传递哪个字节?也就是说,当接收端收到第一个字节的时候,它将这个字节作为高位字节还是低位字节处理,是一个比较有意义的问题;
        UDP/TCP/IP协议规定:把接收到的第一个字节当作高位字节看待,这就要求发送端发送的第一个字节是高位字节;而在发送端发送数据时,发送的第一个字节是该数值在内存中的起始地址处对应的那个字节,也就是说,该数值在内存中的起始地址处对应的那个字节就是要发送的第一个高位字节(即:高位字节存放在低地址处);由此可见,多字节数值在发送之前,在内存中因该是以大端法存放的;所以说,网络字节序是大端字节序;

<3>LSB与MSB
LSB(Least Significant Bit),意为最低有效位;
MSB(Most Significant Bit),意为最高有效位。
LSB与MSB的单位都是bit位,并不是字节
       通常,一个芯片的管脚中,对于一个多比特的信号(就是要搞清楚谁是最高位谁是最低位),比如32根的地址线,从低开始按0到31编个号。MSB就是31,LSB就是0。那么如果标记为:ADDR[31:0]就是MSB first的方式,如果标记为ADDR[0:31]就是LSB first的方式。LSB和MSB是以机器码为单位进行排序。
        实际上,由于CPU存储数据操作的最小单位是一个字节,字节内部的比特序是什么样对我们的程序来说是一个黑盒子。也就是说,你给我一个指向0xB4这个数的指针,对于MSB first方式的CPU来说,它是从左往右依次读取这个数的8个比特;而对于LSB first方式的CPU来说,则正好相反,是从右往左依次读取这个数的8个比特。而我们的程序通过这个指针访问后得到的数都是0xB4。
 

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值