【问题标题】:Little-Endian Signed IntegerLittle-Endian 有符号整数
【发布时间】:2010-10-08 20:57:50
【问题描述】:

我知道 WAV 文件格式对 16 位样本使用有符号整数。它还以小端顺序存储它们,这意味着最低 8 位在前,然后是下一个,依此类推。是第一个字节上的特殊符号位,还是最高有效位(最高值)上的特殊符号位?

含义:
WAV格式的符号位是哪一位?

++---+---+---+---+---+---+---+---++---+---+---+---+---+---+---+---++
|| a | b | c | d | e | f | g | h || i | j | k | l | m | n | o | p ||
++---+---+---+---+---+---+---+---++---+---+---+---+---+---+---+---++
--------------------------- here -> ^ ------------- or here? -> ^

i 还是 p?

【问题讨论】:

  • 至于您的图片,这取决于您如何绘制字节内的位。 :P 如果你把它们画成大端(先高位),那么它将是“i”。如果你接受这一切的小端,那么“p”。无论哪种方式,它都是最后一个字节的高位。

标签: endianness signed


【解决方案1】:

有符号整数,小端:

字节 1(lsb) 字节 2(msb) --------------------------------- 7|6|5|4|3|2|1|0 | 7|6|5|4|3|2|1|0| ---------------------------------- ^ | 符号位

您只需要在向某些外部媒体读取/写入短整数时关注这一点。在您的程序中,符号位是 short 中最重要的位,无论您是在大端还是小端平台上。

【讨论】:

    【解决方案2】:

    符号位是任何二进制补码机器(如 x86)上的最高有效位,因此将在 little-endian 格式的最后一个字节中

    只是因为我不想成为不包括 ASCII 艺术的人... :)

    +---------------------------------------+---------------------------------------+
    |              first byte               |              second byte              |
    +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
    |  0 |  1 |  2 |  3 |  4 |  5 |  6 |  7 |  8 |  9 | 10 | 11 | 12 | 13 | 14 | 15 |
    +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
       ^--- lsb                                               msb / sign bit -----^
    

    位基本上是从大多数人的想法“倒退”表示的,这就是高字节在最后的原因。但这一切都是一致的; “位 15”在“位 0”之后,就像地址应该工作一样,并且仍然是字的最高有效字节的最高有效位。您不必进行任何操作,因为除了最低级别之外,硬件完全按照字节进行通信——因此,当您读取一个字节时,它看起来与您期望的完全一样。只需查看单词的最重要位(或最后一个字节,如果您一次读取一个字节),就会看到您的符号位。

    但请注意,二进制补码并不完全将特定位指定为“符号位”。这只是数字表示方式的一个非常方便的副作用。对于 16 位数字,-x 等于 65536-x 而不是 32768+x(如果高位是严格的符号,情况就是这样)。

    【讨论】:

    • 如果您正在读取实际字节而不是 ASCII 表示,那么是的 - 低 8 位(因此,LSB)将始终是第一个字节,并且上面的 8 个(包括 MSB)将总是是最后一个——这就是“小端”的意思。但是字节中的位被存储,但是硬件想要存储它们。除非您正在构建硬盘驱动器,否则您不必知道或关心它是如何工作的。
    • 我说的是它是如何以 WAV 文件格式存储的,而不是在硬件中。我读到样本存储为 little endian 有符号的 16 位整数。
    • 他们是。这恰好与 x86 处理器处理 16 位值的方式非常接近,这就是它们以这种方式存储的原因。 (Windows 是为与 x86 兼容的 CPU 设计的。)无论哪种方式,符号位都是值的最后一个字节的最高有效位,如上所述。如果byte2 & 0x80 不为零,则您的数字为负数。
    • 不要太在意这些位是从“左到右”还是“从右到左”或其他。字节就是字节,无论它们如何绘制,它们都将具有相同的值。只有硬件需要知道字节中位的顺序。您必须记住的重要一点是,最不重要的 byte 在最前面,最重要的 byte 在最后。整个值的最高有效位将始终是最高有效字节的最高有效位。
    • @ceztko:取决于视角。这将是表示的最高有效字节的最高有效位,这正是大端和小端之间的差异蔓延并使事情复杂化的地方。如果您不想将表示解码为对您的系统有用的值(即:根据需要交换字节),您需要了解表示的字节序以了解最重要的字节在哪里。
    猜你喜欢
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 2020-12-01
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    相关资源
    最近更新 更多