Little-Endian Signed Integer
Я знаю, что формат файла WAV использует целые числа со знаком для 16-битных выборок. Он также сохраняет их в порядке с прямым порядком байтов, то есть младшие 8 битов идут первыми, затем последующими и т. Д. Является ли бит специального знака в первом байте или битом специального знака всегда старший бит (наибольшее значение)?
Имея в виду:
Какой бит знака в формате WAV?
++---+---+---+---+---+---+---+---++---+---+---+---+---+---+---+---++
|| a | b | c | d | e | f | g | h || i | j | k | l | m | n | o | p ||
++---+---+---+---+---+---+---+---++---+---+---+---+---+---+---+---++
--------------------------- here -> ^ ------------- or here? -> ^
я или р?
2 ответа
Знаковый бит является наиболее значимым битом на любом компьютере с двумя дополнениями (например, 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 -----^
Биты в основном представлены "в обратном направлении" от того, как большинство людей о них думают, поэтому старший байт является последним. Но это все соответствует; "бит 15" следует после "бита 0" так же, как должны работать адреса, и по-прежнему является самым старшим битом старшего байта слова. Вам не нужно ничего путать, потому что аппаратные средства говорят в терминах байтов на всех уровнях, кроме самых низких, поэтому при чтении байта он выглядит точно так, как вы ожидаете. Просто посмотрите на самый значимый бит вашего слова (или последний байт, если вы читаете байт за раз), и вот ваш знаковый бит.
Обратите внимание, однако, что дополнение к двум не точно определяет конкретный бит как "знаковый бит". Это просто очень удобный побочный эффект от представления чисел. Для 16-битных чисел -x равно 65536-x, а не 32768+x (что было бы в случае, если бы старший бит был строго знаком).
Со знаком int, little endian:
байт 1(lsb) байт 2(мсб) --------------------------------- 7|6|5|4|3|2|1|0 | 7|6|5|4|3|2|1|0| ---------------------------------- ^ | Знак бит
Вам нужно только позаботиться об этом при чтении / записи краткого int на некоторый внешний носитель. В вашей программе знаковый бит является самым значительным битом в короткой версии, независимо от того, используете ли вы большую или маленькую порядковую платформу.