2010-10-08 68 views
8

我知道WAV文件格式使用16位樣本的有符號整數。它也以小端順序存儲它們,意味着最低的8位首先出現,然後是下一個等等。是第一個字節上的特殊符號位,還是始終位於最高有效位(最高值)上的特殊符號位, ?Little-Endian有符號整數

含義:
哪一個是WAV格式的符號位?

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

我還是p?

+1

至於你的圖片,它取決於你如何繪製字節內的位。 :P如果你畫他們像一個big-endian(高位第一),那麼它會是「我」。如果你擁抱這一切的小端,那麼「p」。無論哪種方式,它將是最後一個字節的高位。 – cHao 2010-10-09 00:13:53

回答

9

符號位是任何二進制補碼機器上最顯著位(如86),因此,將在最後一個字節的小尾數格式

只是因爲我不想是一個不包括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(如果高位是嚴格符號的話就是這種情況)。

+3

如果你讀的是實際的字節而不是ASCII表示,那麼是的 - 低8位(因此LSB)總是*是第一個字節,高8位(包括MSB)總是*是最後的 - 這就是「小端」的意思。但是字節內的位被存儲,但是硬件想要存儲它們。除非您正在構建硬盤驅動器,否則您不必知道或關心它是如何工作的。 – cHao 2010-10-08 21:12:46

+0

我正在談論它如何以WAV文件格式存儲,而不是以硬件存儲。我讀到樣本存儲爲小端符號的16位整數。 – 2010-10-08 22:49:33

+0

他們是。這恰好與x86處理器處理16位值的方式非常接近,這就是爲什麼它們以這種方式存儲的原因。 (Windows是爲兼容x86的CPU生產的。)無論哪種方式,符號位都是該值的最後一個字節的最高位,如上所述。如果'byte2&0x80'非零,那麼你的數字是負數。 – cHao 2010-10-08 23:59:06

9

符號整數,小尾數:

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

你只需要關心自己與當讀/寫短整型一些外部媒體。在你的程序中,無論你是在一個大的還是小的endian平臺上,符號位都是最重要的位。

相關問題