字节序可以指一个字节的位顺序吗?

Med*_*eda 29 c endianness

我正在阅读Chris Adamson撰写的"学习核心音频:适用于Mac和iOS的音频编程动手指南",作者在某一时刻将big-endian描述为:

字节或字的高位在数值上比低位更重要.

但是,直到现在我虽然大小端的问题只适用于字节顺序而不是位顺序.无论我们是在谈论小端还是大端系统,一个字节都具有相同的位顺序(从左到右).我错了吗?作者错了吗?还是我误解了他的观点?

Mic*_*urr 25

由于您不能单独地对一个字节内的位进行寻址,因此通常没有"位字节式"的概念.

  • @Meda:按位运算在数字的抽象二进制表示中处理位位项,而不是物理机器位.因此,它们完全独立于字节序.没有任何东西阻止这些操作存在于三元机器中,三元机器根本没有物理位.在C中,无论字节顺序如何,始终保证将正值向左移位1位将其乘以2. (6认同)
  • 但是,当你进行像移位这样的按位操作时,不要"解决"它们吗? (5认同)
  • 移位时,您仍然将位作为较大单元(byte,int或其他)的一部分处理.Endianess仅在您可以逐字节直接寻址更大的对象时才有意义 - 您需要知道这些可单独寻址的字节如何在较大的对象中排列. (5认同)
  • @Meda当你降低到单个字节的位移位时它的"表示"(它对应的数字)可以分解,它只是1和0的任意集合.在给定的"方向"上传递的旋转(ROL,ROR,RCL,RCR)或移位(SHL,SHR ......)的指令与数字本身一样抽象. (5认同)

R..*_*R.. 21

存在"位顺序"之类的唯一意义是将位分配给位域的顺序.例如,在:

union {
    struct {
        unsigned char a:4;
        unsigned char b:4;
    } bf;
    unsigned char c;
};
Run Code Online (Sandbox Code Playgroud)

取决于实现,表示bf.a可以占用高四位c或低位四位c.位域成员的顺序是否与字节顺序匹配是实现定义的.

  • 在现实世界中最简单的例子:https://github.com/freebsd/freebsd/blob/master/sys/netinet/ip.h#L51-L59 (5认同)

Nom*_*mal 17

这不是对所述问题的回答 - 已经有其他人已经很好地回答了 - 但是一个脚注解释了一些术语,希望它能澄清相关的概念.特别是,这根本不是特定于的.


  • 字节顺序和字节顺序

    当除了字节大的值被存储或序列化到多个字节,其中,成分字节存储的阶数的选择被称为字节顺序,或端序.

    从历史上看,已经使用了三个字节顺序:" big-endian "," little-endian "" PDP-endian "" middle-endian ".

    big-endianlittle-endian字节顺序名称是从它们对字节排序的方式派生出来的:big-endian首先放置最重要的字节(影响逻辑值的字节最多),连续字节按重要性递减顺序排列; 而little-endian将最低有效字节放在第一位,连续字节按重要性递增.

    请注意,整数类型和浮点类型的字节顺序可能不同; 它们甚至可以在单独的硬件单元中实现.但是,在大多数硬件上,它们具有相同的字节顺序.
     

  • 位顺序

    位顺序与字节序非常相似,只是它涉及单个位而不是字节.这两个概念是相关的,但并不相同.

    位顺序仅在位序列化时有意义,例如通过串行或SPI或I 2 C总线; 相继.

    在并行使用的较大组中引用位时,作为一个单元,如字节或字,则没有顺序:只有标记重要性.(这是因为它们作为一个组被并行地,而不是一个接一个地连续访问和操作,没有特定的顺序.它们作为一个组的解释产生了不同的重要性,我们人类可以为它们标记或编号易于参考.)
     

  • 有意义

    当一组位被视为二进制值时,存在最低有效位最高有效位.这些名称源自如下事实:如果更改最低有效位,则位组的值将以可能的最小量更改; 如果更改最高有效位,则位组的值将以可能的最大量(通过单个位更改)更改.

    假设你有一个五位组,比如a,b,c,de,形成一个五位无符号整数值.如果a是最重要的,并且e是最不重要的,并且其他三个是按重要性递减的顺序,则无符号整数值是
        = a ·2 4 + b ·2 3 + c ·2 2 + d ·2 1 + e ·2 0

        = 16 a + 8 b + 4 c + 2 d + e

    换句话说,比特重要性来自一组比特的数学(或逻辑)解释,并且完全独立于某些总线上的比特可能被序列化的顺序,也来自任何人类指定的标签或数字. .

    对于逻辑上构造数值的所有位组都是如此,即使对于浮点数也是如此.
     

  • 位标签或位编号

    例如,为了便于在文档中引用,标记各个位通常很有用.这基本上是武断的; 事实上,我在上面的例子中使用了字母af.更常见的是,数字比字母更容易 - 用单个字母标记超过27位并不容易.

    有两种方法用数字标记位.

    目前最常见的是根据它们的重要性来标记位,位0指的是最低有效位.这很有用,因为位i具有逻辑值2 i.

    在某些体系结构的文档中,如IBM的POWER文档,最重要的位标记为0,按重要性降序排列.在这种情况下,位的逻辑值取决于该单元中的位数.如果一个单元有N位,则位i的逻辑值为2 N -i-1.

    虽然这种排序可能会感觉很奇怪,但这些架构都是大端的,人们只记得/假设最重要的架构首先出现在这些系统上可能是有用的.

    但请记住,这是一个完全随意的决定,在这两种情况下,文档都可以使用其他位标记方案编写,而不会对系统的实际性能产生任何影响.这就像选择是从左到右,还是从右到左(或从上到下,就此而言)进行编写:只要您了解并理解惯例,内容就不会受到影响.
     

虽然字节顺序和位标记之间存在某种相关性,但上述所有四个概念都是分开的.

字节顺序和位标记之间存在相关性 - 在某种意义上,许多大端硬件的文档使用位标记,其中最重要的位是位零 - 但这仅仅是因为人类选择了.

,C编译器在结构中包含位域的顺序因编译器和体系结构而异.完全没有C标准规定.因此,将二进制文件读入具有位域的结构类型通常是个坏主意.(即使它适用于某些特定的机器和编译器,也不能保证它适用于其他机器;通常,它不会.所以,它肯定会使代码不那么便携.)而是读入缓冲区和数组unsigned char,和使用辅助访问器函数使用位移(<<,>>),二进制ors(|)和掩码(二进制和,&)从数组中提取位字段.


Ant*_*ony 11

除非您正在使用允许您单独寻址位的奇异系统,否则按位顺序的字节的"字节序"并不是真正关注的问题.在决定如何通过线路传输数据时,这可能是一个问题,但这个决定通常是在硬件级别做出的.

音频

就与音频流的相关性而言,它非常重要.负责将数字音频流转换为模拟音频信号的硬件可以期望流中的比特处于特定顺序.如果他们错了,声音可能会完全被打破.也许你的书的作者详细阐述了这一点?无论如何,正如我之前提到的,这通常是在硬件级别决定的,并且在用户甚至内核级别进行编程时并不是真正的问题.通常,行业标准将定义两个硬件如何将数据相互传输.只要你的所有硬件都同意bit endian,那么一切都很好.

进一步阅读维基百科.

  • +1表示串行传输顺序。这与C语言没有直接关系,但是当然与C的许多使用有关。 (2认同)

Ale*_*Dan 7

字节内的位的顺序没有意义,字节内的位不可寻址,因此您无法定义此位的顺序以将其用作字节序定义的参考.与位不同,字节是可寻址的,因此我们可以使用地址顺序作为参考来定义小端或大端的含义.

你可能会得到这样的印象:Left shift <<或者Right Shift >>位操作符间接暗示一个字节内有一个已定义的位顺序,但事实并非如此.这两个术语基于抽象字节表示,其中最低位位于右侧,位向左移动时值越高,但根据定义Left shift与乘以2 Right shift具有相同的效果,并且具有与除以2相同的效果(对于无符号整数).