看蓝牙协议时总是会看到用LSB MSB来画表格,标识bit位次序。
存储字节序(字可以理解为1bytes,bytes order)
目前看到启发比较好的是这篇《关于大小端的个人理解》(https://blog.csdn.net/fuhang95/article/details/111570800)
以32位机器为例
unsigned int a = 0x12345678;
我们知道计算机在内存中存储的是二进制代码,大小端存储分别如下图所示:
这其中,大端存储方式和我们的阅读习惯相同,可以直接读作12345678,
而小端,则与我们的逻辑习惯相同,高地址上存更加重要的数据。
ps:这个表格就太传神了。
大小端是操作系统关心的。
计算机读取内存数据从低地址向高地址读取?这个就不太清楚了!
这里又涉及到存储时是从低地址向高地址存,还是从高地址往低地址的顺序存?
为什么会有大小端模式之分?
因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(根据编译器的位数,通过sizeof(long)获取),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节。那么就必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。
例如一个16bit的short型X,在存储中的地址为0x0010,X的值为0x1234,那么0x12为高字节,0x34位低字节。对于大端模式,就将0x12存储在低地址中,即0x0010中,0x22存储在高地址中,即0x0011中。小端模式刚好相反。
原文链接:https://blog.csdn.net/u012377333/article/details/65631760
大小端目前的使用情况?
目前Intel的80x86系列芯片是唯一在坚持使用小端的芯片,ARM芯片默认采用小端,但是可以切换为大端;而MIPS等芯片要么采用全部大端的大端存储,那么提供选项支持大端–可以在大小端之间切换。另外,对于大小端的处理也和编译器的实现由关,在C语言中,默认是小端(但在对于一些单片机的实现中确实基于大端,比如Keil 51C),Java是平台无关的,默认是大端的。在网络上传输数据普遍也是大端模式。
#include <stdio.h>
// typedef unsigned char byte;
void main()
{
int a = 0x12345678;
// 取低地址的值
char *p = (char *)(&a);
// 判断低地址的值和低字节的值是否相等
if (*p == 0x78)
{
// 低地址存储低字节的值就是小端模式
printf("little!\n");
}
else if (*p == 0x12) // 判断低地址的值和高字节的值是否相等
{
// 低地址的值存储高字节的值就是大端模式
printf("big!\n");
}
else
{
printf("other!\n");
}
getchar();
}
操作系统在存储数据时的最小操作单元是字节(即1bytes)。
MSB:Most Significant Bit
LSB: Last(Least) Significant Bit
大端模式就是说操作系统在存数据时把数据的重要比特存到低地址,不重要的存到高地址; —低地址放重要字节,地址和字节重要程度相反
小端模式:重要比特存到高地址,不重要的存到低字节; —重要字节放高地址,地址和字节重要程度相同
大小端是操作系统的存储数据模式,和操作系统有关。
参考《深入了解MSB和LSB》(https://blog.csdn.net/ustc_dylan/article/details/5412906)
Bit order
以及还有比特序 (bit order) ,大小端模式中每个字节的比特序是怎样的?
这其实是不用关心的,反正操作系统从某个地址取出一字节的内容,无论怎么存,取得的数值都是一样的。
网络字节传输顺序
还有注意互联网中传输数据时,一般使用大端模式。
蓝牙射频发射
通过蓝牙射频发射数据时的比特序遵从小端模式。
如下图,X = 0b011,
发送时先发送LSB即1,最后发送0。
不管怎么样,接收端先收到的坑定是低地址的字节数据,之后收到的是更高字节的数据。
还有就是发送的时候是逐比特发送还是怎么发送,还有和编码方式有啥关系?
蓝牙的传输速率是怎么受到影响的?
参考HCI,
字,字长
数电中会有说明,逻辑电路存储器的原理。
字长
存储容量的计算
地址