Little-Endian签名整数

时间:2010-10-08 20:57:50

标签: endianness signed

我知道WAV文件格式使用16位样本的有符号整数。它还以little-endian顺序存储它们,这意味着最低的8位先到,然后是下一个,等等。第一个字节是特殊符号位,还是特殊符号位总是位于最高位(最高值) ?

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

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

我或p?

2 个答案:

答案 0 :(得分:12)

signed int,little endian:

byte 1(lsb)       byte 2(msb)
---------------------------------
7|6|5|4|3|2|1|0 | 7|6|5|4|3|2|1|0|
----------------------------------
                  ^
                  | 
                 Sign bit

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

答案 1 :(得分:10)

符号位是任何二进制补码机器上最重要的位(如x86),因此将以小端格式存在于最后一个字节中

因为我不想成为不包括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 -----^

比特基本上代表了大多数人对它们的看法“向后”,这就是为什么高字节是最后一个。但这一切都是一致的; “bit 15”位于“bit 0”之后,就像地址应该工作一样,并且仍然是该字的最重要字节的最高位。你不需要做任何麻烦,因为硬件会根据字节来讨论最低级别 - 所以当你读取一个字节时,它看起来就像你期望的那样。只要查看单词的最高位(或者它的最后一个字节,如果你一次读取一个字节),那就是你的符号位。

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