MSB&LSB与Endianness

目录(?)[+]

MSB&LSB与Endianness

参考资料

http://www.merriam-webster.com/dictionary/positional%20notation

http://www.buczynski.com/Proteus/msblsb.html 
https://en.wikipedia.org/wiki/Most_significant_bit 
https://en.wikipedia.org/wiki/Least_significant_bit 
https://en.wikipedia.org/wiki/Bit_numbering 
https://support.microsoft.com/en-us/kb/130861

https://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Data/endian.html 
https://support.microsoft.com/en-us/kb/102025 
https://en.wikipedia.org/wiki/Endianness

MSB和LSB

解释:

  • MSB = most significant bit 最高有效位,也称high-order bit
  • LSB = least significant bit 最低有效位

由于我们普遍使用的记数方法一般都是Positional notation(位置记法),不同的位置其“权”不同。所以,一般地,MSB也可称做left-most bit,LSB也可称作right-most bit。

例如,数值150的二进制表示法:1001 0110,即8-bit二进制数:

|   1  |  0 |  0 |  1 |  0 |  1 |  1 |   0  |
| bit7 | .. | .. | .. | .. | .. | .. | bit0 |
   
   
  • 1
  • 2
  • 1
  • 2

这里,bit7就是MSB,bit0就是LSB. 
通俗的说,就是在一个数值中,占比重最高的位即这个数的最高位叫MSB,占比重最低的位即这个数的最低位叫LSB

严格地讲,MSB和LSB指二进制数的bit位。宽泛地讲,这个数可以不限于二进制,比如Byte,十六进制数0x12345678中,MSB可以指字节0x12,LSB可以指字节0x78。

其实,MSB和LSB就是用来陈述了一个数中的高位低位。

常见应用场合:

MSB和LSB最常见的使用,就是在数据传输中,用来约定数据传输的顺序

比如通讯中说 MSB First 或 LSB First,就是在约定 the ordering of the sequence of the bits in the bytes sent over a wire in a transmission protocol or in a stream.

例如,接收方依次收到1-0-0-1-0-1-1-0,如果约定MSB,则为b10010110==150,如果约定LSB,则为b01101001==105.

MSB和LSB的扩展用途

MSB和LSB的基本意义,是用来指明一个二进制数值中的 bit positions ,即哪个是最高位、哪个是最低位(bit)。 
同样地,我们也可以把这种方式拓展,拿来代指在一个多字节(multi-bytes)的数值中,哪个字节是最高字节,哪个字节是最低字节(byte)。在这种场合下,我们可以把MSB和LSB中的 B 当做Byte看待。

Endian

这里我们假定 sizeof(int) == 4.

那么变量 int i = 0x12345678; 的值在内存(memory)中是怎么放置的呢? 
(在变量i中,MSB就是0x12,LSB就是0x78

两种存储方案:

  • 方案一:
|   12   |   34   |   56   |   78   |
| addr+0 | addr+1 | addr+2 | addr+3 |
   
   
  • 1
  • 2
  • 1
  • 2
  • 方案二:
|   78   |   56   |   34   |   12   |
| addr+0 | addr+1 | addr+2 | addr+3 |
   
   
  • 1
  • 2
  • 1
  • 2

我们沿着地址增长的方向看下去, 
方案一,首先看到的是0x12即MSB,也就是说先看到一个数据中的占“大头”的部分,所以叫做 big endian。 
方案二,首先看到的是0x78即LSB,也就是说先看到一个数据中的占“小头”的部分,所以叫做 little endian

endian的一个简单探测程序:

int   i = 1;
char *p = (char *)(&i);

if (1 == p[0])
{
    printf("little endian\n");
}
else
{
    printf("big endian\n");
}
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值