2013-05-28 15 views
14

Czytam „Uczenie Core Audio: hands-on przewodnik do audio programowania dla Mac i iOS” Chris Adamson iw pewnym momencie autor opisuje grubokońcej jak:Czy endianness odnosi się do kolejności bitów w bajcie?

wysokich bity bajt lub słowo są liczbowo ważniejsze niż dolne.

Jednak do tej pory I chociaż problem big-endian niewiele ma zastosowanie wyłącznie do bajt zamówienia i nie nieco zlecenia. Jeden bajt ma tę samą kolejność bitów (od lewej do prawej), bez względu na to, czy mówimy o małych endianach czy dużych systemach endian. Czy się mylę? Czy autor jest zły? Czy też źle zrozumiałem jego punkt widzenia?

Odpowiedz

12

Ponieważ zwykle nie można adresować bitów w bajcie, ogólnie nie ma pojęcia "endianness bit".

+2

Ale kiedy wykonujesz operacje bitowe, takie jak przesuwanie, czy nie "adresujesz" ich? – Meda

+3

Podczas zmiany, nadal zajmujesz się bitami jako częścią większej jednostki (bajt, int lub coś podobnego). Endianess ma znaczenie tylko wtedy, gdy możesz bezpośrednio adresować większy obiekt bajt po bajcie - musisz wiedzieć, jak te indywidualnie adresowalne bajty są ułożone w większym obiekcie. –

+3

@Meda, gdy jesteś na poziomie przesunięcia bitowego jednego bajtu, jego "reprezentacja" (numer, który odpowiada) może się zepsuć i jest to po prostu dowolna kolekcja 1 i 0. Instrukcje przekazywane do obracania (ROL, ROR, RCL, RCR) lub zmiany (SHL, SHR ...) w danym "kierunku" są tak abstrakcyjne, jak same liczby. –

7

Jedyny sens, w którym istnieje coś takiego jak "kolejność bitów", to kolejność, w której bity są przypisane do bitfieldów. Na przykład, w:

union { 
    struct { 
     unsigned char a:4; 
     unsigned char b:4; 
    } bf; 
    unsigned char c; 
}; 

zależności od implementacji, reprezentacja bf.a może zajmować wysokie cztery bity c lub niskie cztery bity c. To, czy porządkowanie elementów bitfielda odpowiada kolejności bajtów, jest zdefiniowane przez implementację.

6

"Endianness" bajtu pod względem kolejności bitów nie stanowi problemu, chyba że pracujesz z egzotycznym systemem, który pozwala na adresowanie bitów osobno. Może to być problemem przy podejmowaniu decyzji o przesyłaniu danych przez kabel, ale decyzja ta jest zwykle podejmowana na poziomie sprzętowym.

audio

chodzi o znaczenie dla audio streaming, to może równie dobrze być ważne. Sprzęt odpowiedzialny za przekształcenie strumienia cyfrowego dźwięku w analogowe sygnały audio może oczekiwać, że bity w strumieniu będą w określonej kolejności. Jeśli się nie mylą, dźwięk może wydawać się całkowicie zbity z tropu. Być może autor twojej książki rozwiąże ten problem? W każdym razie, jak wspomniałem wcześniej, zwykle jest to ustalane na poziomie sprzętowym i nie jest tak naprawdę problemem przy programowaniu na poziomie użytkownika, a nawet jądra. Ogólnie rzecz biorąc, standardy branżowe określają, w jaki sposób dwa urządzenia będą przesyłać dane do siebie nawzajem. Tak długo, jak cały twój sprzęt zgadza się na endianness bit, wtedy wszystko jest w porządku.

Further reading at Wikipedia.

+0

+1 za podanie numeru seryjnej transmisji. Nie jest to bezpośrednio związane z językiem C, ale ma oczywiście znaczenie dla wielu zastosowań C. –

2

Kolejność bitów wewnątrz Byte nie ma sensu, bity wewnątrz bajt nie mogą być adresowane, więc nie można określić kolejność tych bitów używać go jako punkt odniesienia dla definicji endianness . W przeciwieństwie do bitów, bajty są adresowalne, więc istnieje kolejność adresów, którą możemy wykorzystać jako odniesienie do określenia, co oznacza mały lub duży endian.

Można odnieść wrażenie, że operatory bitowo-pośrednie implikują pośrednio, że istnieje określona kolejność bitów wewnątrz bajtu, ale to nie jest prawda. Te dwa pojęcia są oparte na abstrakcyjnej reprezentacji bajtów, gdzie najniższy bit znajduje się po prawej stronie, a bity osiągają wyższą wartość po przejściu w lewo, ale z definicji Left shift ma taki sam efekt jak mnożenie przez 2, a Right shift ma ten sam efekt co dzielenie o 2 (dla liczb całkowitych bez znaku).

Powiązane problemy