C/C++中的位顺序

11

我需要实现一个协议,该协议定义了以8位字为单位的数据,并且最不重要的位(LSB)优先。我想使用 unsigned char 实现这个数据,但我不知道在 C/C++ 中LSB和最高有效位(MSB)的位顺序是什么,这可能需要交换位。

有人能解释一下如何确定一个unsigned char是如何编码的吗:采用 MSB-LSB 还是 LSB-MSB 顺序?

示例:

unsigned char b = 1;

MSB-LSB: 0000 0001 LSB-MSB: 1000 0000


可能是在C++程序中以编程方式检测字节序的重复问题。 - Armen Tsirunyan
6
你确定你需要位序而不是字节序吗?通常在讨论协议时,LSB代表最不重要的字节,MSB也是如此。 - sashang
特别是,那个问题的第二个答案可能是你正在寻找的。 - Matthew Scharley
1
@ArmenTsirunyan - 这个问题与那个问题稍有不同,因为另一个问题问的是你期望的字节序,而这个问题则询问通常不用担心的字节序。特别是,我不认为那个问题的答案能满足这个问题。 - JustJeff
2个回答

13

字节序是与平台相关的。不过,除非您正在序列化字节,否则无需担心实际的位顺序问题。在这种情况下,您仍然无需担心单个字节在计算机上的存储方式,因为您始终需要逐个提取位。幸运的是,如果您使用按位与运算符和1进行运算,无论存储顺序如何,都将获得最低有效位(LSB);使用按位与运算符和2进行运算,您将获得下一个最高有效位,以此类推。编译器将解决在机器代码中生成常量的细节,所以这个层面的细节被抽象掉了。


2
网络和文件相关的东西很少涉及到比特级别,除非你在编写设备驱动程序。所有有用的用户级别工具都是以字节为单位工作的。 - cHao

5
在C/C++中没有这样的概念。最低有效位就是最低有效位。由于位没有地址,因此没有其他排序方式。

1
在传输过程中,存在着。 - user703016
@Cicada:但不是用C语言吗?我的意思是,你可以按照一定的顺序拆分字节,但没有平台相关的正确顺序。 - undur_gongor
4
实际上,在C语言中不存在比特顺序这样的概念。然而,不同的物理架构可能会按照不同的顺序存储位。由于OP正在开发协议,因此我认为解释这种差异非常重要。 - user703016
1
@Cicada:除非你实现硬件并实际连接一些芯片,否则就没有“位序”问题。只有当某个芯片从串行线上取出位并以不正确的顺序将其放入寄存器时,才会出现这些问题。当数据在主内存中且可由CPU访问时,位序是正确的,无法破坏。我们之所以在字中遇到所有这些大小端问题,是因为我们有比字小的数据类型。幸运的是,字节没有这样的麻烦。 - blaze
@blaze:冒着重复的风险,我要指出位顺序问题出现在传输过程中,而不是存储过程中。 - user703016
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接