Czy bajt zawiera 8 bitów, czy 9?

56

Przeczytałem w tym instruktażowym samouczku programowania, że 8 bitów służy do danych, a 1 bit do parzystości, który jest następnie wykorzystywany do wykrywania błędu parzystości (spowodowanego przez awarię sprzętu lub zakłócenia elektryczne).

Czy to prawda?

xtt
źródło
5
Zobacz cs.stackexchange.com/a/19851/584 w celu omówienia, czym może być bajt .
AProgrammer
63
Ten artykuł jest pełen nonsensów i należy go zignorować.
David Schwartz,
12
Jeśli chcesz być pedantyczny, po prostu nazywaj je „oktetami”. Ten artykuł jest napisany z myślą o bardzo specyficznym procesorze (z jakiegoś powodu, który musi przechowywać bity parzystości w pamięci ROM ...) lub jest po prostu zwariowany. Mikroczip PIC na przykład używają 14-bitowej długości słowa. Cała pamięć programu jest uporządkowana w tablicy N x 14 bitów.
Nick T
13
@NickT: jednak to nie to samo. Oktet ma zawsze 8 bitów, bajt może być dowolny.
Jörg W Mittag,
4
Artykuł mógł odwoływać się do mechanizmów korekcji pamięci używanych na niektórych wczesnych komputerach IBM, ale stwierdzenie, że „bajt to dane 8-bitowe + 1-bitowa parzystość” jest kompletnym nonsensem. Na przykład dyski CD-ROM zwykle wykorzystują mechanizmy korekcji błędów, które są o wiele bardziej chciwe - typowa płyta audio CD zużywa 8 bajtów na 24 bajty danych audio. Ale najważniejsze jest to, że Cię to nie obchodzi . W ogóle. Jest wyłączny dla faktycznego mechanizmu przechowywania pamięci - procesor nie obchodzi, twój kod nie obchodzi
Luaan,

Odpowiedzi:

79

Bajt danych to osiem bitów, może być więcej bitów na bajt danych, które są używane w systemie operacyjnym lub nawet na poziomie sprzętowym do sprawdzania błędów (bit parzystości lub nawet bardziej zaawansowany schemat wykrywania błędów), ale dane to osiem bity i każdy bit parzystości jest zwykle niewidoczny dla oprogramowania. Bajt został znormalizowany, aby oznaczać „osiem bitów danych”. Tekst nie jest błędny, mówiąc, że może być więcej bitów przeznaczonych do przechowywania bajtu danych niż osiem bitów danych, ale zwykle nie są one uważane za część bajtu per se, sam tekst wskazuje na ten fakt.

Możesz to zobaczyć w poniższej sekcji samouczka:

Doubleword: a 4-byte (32 bit) data item

4 * 8 = 32, w rzeczywistości może zająć 36 bitów w systemie, ale dla twoich celów i celów jest to tylko 32 bity.

JustAnotherSoul
źródło
5
Cóż, jeśli sprzęt implementuje wykrywanie błędów, prawdopodobnie zrobiłby to z większymi kawałkami pamięci niż bajt, na przykład z sektorami 512-bajtowymi ... w ten sposób można zmniejszyć obciążenie dodatkowej pamięci. Tylko dla wyjaśnienia: nawet z korekcją błędów sprzęt nadal używa 8-bitów na bajt plus trochę bitów na każdy „fragment” danych, który prawdopodobnie jest znacznie większy niż pojedynczy bajt.
Bakuriu,
11
Zauważ, że istnieją systemy z widocznymi programowo, nie 8-bitowymi bajtami. Zobacz Które platformy mają coś innego niż 8-bitowy znak? pytanie na StackOverflow.
Ruslan
3
Tak, naprawdę istnieją. Chociaż ten konkretny link mówi o znakach innych niż 8-bitowe. Niby: bajt po prostu odnosi się do liczby bitów, które dany system wziął do przechowywania znaku „char”, który wynosił zaledwie sześć bitów. Ale IIRC jest znormalizowane w specyfikacji IEC-80000, że bajt ma 8 bitów. Kiedy odchodzisz od systemów głównego nurtu, oczywiście zdarzają się dziwactwa, a standardy nie są prawami.
JustAnotherSoul,
3
@JustAnotherSoul: Istnieją konkurencyjne standardy, które definiują bajt jako „co najmniej 8-bitowy” lub w inny sposób. Interesujące jest zobaczyć, jak dekady później definicja bajtów zmienia się w umysłach ludzi. W czasach o wiele większej różnorodności architektonicznej bajt był po prostu najmniejszą adresowalną jednostką twojej architektury (spójrz na różne PDP dla przykładów). Jest to również powód, dla którego w pojawieniu się Internetu termin oktet był używany do opisania danych w sieci, ponieważ bajt nie był uniwersalnym słowem dla fragmentu danych 8-bitowych.
PlasmaHH,
2
@JustAnotherSoul pamiętaj, że charw C (o to chodzi w odnośniku) jest dokładnie najmniejsza adresowalna jednostka pamięci. To się nazywa po prostu char , ale Standard C czyni go synonimem bajtu .
Ruslan
48

Tradycyjnie bajt może mieć dowolny rozmiar i jest po prostu najmniejszą adresowalną jednostką pamięci. Obecnie 8-bitowe bajty zostały w zasadzie ujednolicone dla oprogramowania. Jak powiedział JustAnotherSoul, sprzęt może przechowywać więcej bitów niż 8 bitów danych.

Jeśli pracujesz na programowalnych urządzeniach logicznych, takich jak FPGA, możesz zauważyć, że ich pamięć wewnętrzna jest często adresowalna jako 9-bitowe porcje, a jako autor HDL możesz użyć tego 9-bitowego do sprawdzenia błędów lub po prostu do przechowywania większych ilości danych na „bajt”. Kupując układy pamięci na niestandardowy sprzęt, zazwyczaj masz do wyboru 8 lub 9 bitowych jednostek adresowalnych (lub 16/18, 32/36 itd.), A następnie od Ciebie zależy, czy masz 9-bitowe „bajty” i co robisz to z 9. bitem, jeśli zdecydujesz się go mieć.

Extrarius
źródło
10
Ogólnie, gdy istnieje grupa danych, która logicznie jest pojedynczą jednostką, ale zawiera więcej / mniej niż 8 bitów, nazywa się to „słowem”. Na przykład niektóre procesory używają 40-bitowego słowa instrukcji.
Devsman,
3
+1. Nawiasem mówiąc, istnieją architektury z „wskaźnikami bitowymi” i „wskaźnikami bajtowymi”. W takich architekturach technicznie bajt nie jest „najmniejszą adresowalną jednostką pamięci” (ponieważ każdy adres można adresować niezależnie), choć trudno jest zwięźle powiedzieć, co to jest . Myślę, że to coś w rodzaju „wiem, kiedy to widzę”. :-P
ruakh
18
„Oktet” to tradycyjnie używane słowo oznaczające „nazwałbym to bajtem, ale tak naprawdę mam na myśli dokładnie 8 bitów” dla różnych protokołów komunikacyjnych między systemami, które mogą mieć różne rozmiary bajtów. Ale w dzisiejszych czasach używanie bajtu w znaczeniu innym niż 8 bitów jest anachroniczne.
wnoise
@Devsman Niekoniecznie. Układy x86 mają na przykład 32-bitowe słowa i 8 bitów. Bajt to najmniejszy adresowalny rozmiar. Słowo jest nieco bardziej niejasno zdefiniowane, ale zwykle jest to rozmiar, który jest najwygodniejszy w pracy; tj. oczekiwana długość operandu większości instrukcji.
Ray
To powinno być oznaczone jako poprawna odpowiedź, jest bardziej poprawne.
awiebe
32

Ten tekst jest wyjątkowo źle sformułowany. Prawie na pewno mówi o pamięci RAM ECC (korekty błędów) .

Ram ECC zwykle przechowuje informacje o wartości 8 bitów przy użyciu 9 bitów. Dodatkowy bit na bajt służy do przechowywania kodów korekcji błędów.

ECC kontra spoza ECC (W obu przypadkach każdy bajt jest rozłożony na każdy układ. Zdjęcie dzięki uprzejmości Puget Systems )

To wszystko jest całkowicie niewidoczne dla użytkowników sprzętu. W obu przypadkach oprogramowanie korzystające z tej pamięci RAM widzi 8 bitów na bajt.


Nawiasem mówiąc: kody korygujące błędy w pamięci RAM zwykle nie są w rzeczywistości 1 bitem na bajt; zamiast tego mają 8 bitów na 8 bajtów. Ma to taki sam narzut przestrzeni, ale ma pewne dodatkowe zalety. Zobacz SECDED, aby uzyskać więcej informacji.

BlueRaja - Danny Pflughoeft
źródło
12
Pamięć RAM parzystości i pamięć RAM ECC to różne rzeczy. Pamięć RAM parzystości przechowuje jeden dodatkowy bit na domenę błędów, może wykryć wszystkie błędy jednobitowe i żadnych błędów dwubitowych i nie może nic naprawić. ECC przechowuje szereg dodatkowych bitów na domenę błędów, może wykryć i naprawić wszystkie błędy jednobitowe, może wykryć, ale nie naprawić wszystkich błędów dwubitowych, i może złapać niektóre większe błędy. Pamięć RAM parzystości jest obecnie rzadka, ponieważ została prawie całkowicie zastąpiona przez pamięć RAM ECC.
Mark
1
@Mark: Wskazałem na to w ostatnim akapicie, link zawiera więcej szczegółów. Pamięć RAM parzystości w zasadzie nie istnieje obecnie, ponieważ kod korekty błędów (72, 64) ma taki sam narzut jak kod parzystości (9,8).
BlueRaja - Danny Pflughoeft,
7
Wskazując na to, podajesz również rzeczy, które sprawiają, że jest to nieprecyzyjne / mylące. Pamięć ECC RAM nie „przechowuje informacji o wartości 8 bitów przy użyciu 9 bitów”. Stwierdzenie, że oznacza, że ​​można wykonać ECC dla 8 bitów za pomocą 9 bitów, co nie jest możliwe. Dla 8 bitów informacji dyskretnych wystarczy 1 dodatkowy bit, aby wykryć , a nie poprawić, błędy jednobitowe. ECC używają większej liczby bitów lub bajtów, aby zawierać dane wystarczające do skorygowania błędów w grupach danych, zwykle większych niż jeden bajt. Chociaż może to średnio dodatkowy bit na 8 bitów, nie mogą być podzielone na powiązanie tylko jeden kawałek z każdego z 8 bitów.
Makyen
Istnieje schemat 36-bitowy (32-bitowe słowo + 4-bitowe ECC), który pozwala na korekcję błędów jednego bitu i wykrywanie błędów dwóch bitów. Chociaż można go arytmetycznie podzielić na 8 bitów danych + 1 bit ECC, nie może / nie działa w ten sposób. Wymagane są pełne 4 bity ECC, które obejmują 32 bity danych.
Zenilogix,
@Zenilogix i inni, którzy powtórzyli to samo: bardzo dobrze rozumiem, jak działa ECC i nic, co powiedziałem, było nieprawidłowe. Nigdy nie twierdziłem, że 8-bitowe ECC można wykonać przy użyciu 9 bitów. Powiedziałem, że pamięć ECC RAM używa 9-bitów na bajt pamięci. Jak działa ECC, jest całkowicie poza zakresem tego pytania, dlatego zostawiłem szczegóły na bok z linkiem. Proszę przestać wszystkie pedantyczne komentarze.
BlueRaja - Danny Pflughoeft,
16

Ogólnie rzecz biorąc, krótką odpowiedzią jest to, że bajt ma 8 bitów. Upraszcza to sprawę (czasami nawet do niedokładności), ale jest to definicja, którą zna większość ludzi (w tym duża liczba programistów), i definicja, którą prawie wszyscy domyślnie używają (bez względu na to, ile bajtów o różnej wielkości są „ musiałem pracować).

Mówiąc dokładniej, bajt jest najmniejszą adresowalną jednostką pamięci dla danej architektury i jest na ogół wystarczająco duży, aby pomieścić pojedynczy znak tekstowy. W większości nowoczesnych architektur bajt jest definiowany jako 8 bitów; ISO / IEC 80000-13 określa również, że bajt ma 8 bitów, podobnie jak popularny konsensus (co oznacza, że ​​jeśli mówimy o, powiedzmy, 9-bitowych bajtach, napotkasz wiele problemów, chyba że wyraźnie stwierdzam, że nie masz na myśli normalnych bajtów).

Istnieją jednak wyjątki od tej reguły. Na przykład:

Tak więc w większości przypadków bajt będzie generalnie miał 8 bitów. Jeśli nie, to prawdopodobnie 9 bitów i może, ale nie musi, być częścią słowa 36-bitowego.

Justin Time
źródło
8

Zauważ, że termin bajt nie jest dobrze zdefiniowany bez kontekstu. Jeśli chodzi o architektury komputerowe, możesz założyć, że bajt jest 8-bitowy, przynajmniej w przypadku nowoczesnych architektur. Zostało to w dużej mierze znormalizowane przez języki programowania, takie jak C, które wymagały, aby bajty miały co najmniej 8 bitów, ale nie dawały żadnych gwarancji dla większych bajtów, co czyniło 8 bitów na bajt jedynym bezpiecznym założeniem.

Są komputery z jednostkami adresowalnymi większymi niż 8 bitów (zwykle 16 lub 32), ale te jednostki są zwykle nazywane słowami maszynowymi, a nie bajtami. Na przykład DSP z 32-bitowymi 32-bitowymi słowami RAM będzie reklamowany jako mający 128 KB lub RAM, a nie 32 KB.

Rzeczy nie są tak dobrze zdefiniowane, jeśli chodzi o standardy komunikacji. ASCII jest nadal szeroko stosowany i ma 7-bitowe bajty (które ładnie mieszczą się w 8-bitowych bajtach na komputerach). Nadajniki-odbiorniki UART są nadal produkowane z konfigurowalnym rozmiarem bajtów (zwykle trzeba wybrać co najmniej 6, 7 i 8 bitów na bajt, ale nie jest to niespotykane 5 i 9).

Dmitrij Grigoriew
źródło
6

Bajt jest zwykle definiowany jako najmniejsza indywidualnie adresowalna jednostka pamięci. Może mieć dowolny rozmiar. Istnieją architektury o rozmiarach bajtów od 6 do 9 bitów, może nawet większych. Istnieją również architektury, w których jedyną adresowalną jednostką jest rozmiar magistrali, w takich architekturach możemy albo powiedzieć, że po prostu nie mają bajtu , lub bajt ma taki sam rozmiar jak słowo (w jednym konkretnym przypadku wiem, że być 32-bitowy); tak czy inaczej, zdecydowanie nie jest to 8-bit. Podobnie istnieją architektury adresowalne bitowo, na tych architekturach moglibyśmy ponownie argumentować, że bajty po prostu nie istnieją, lub argumentować, że bajty są 1-bitowe; tak czy inaczej jest sensowną definicją, ale 8-bit jest zdecydowanie błędny.

Na wielu architekturach ogólnego przeznaczenia jeden bajt zawiera 8 bitów. Nie jest to jednak gwarantowane. Im bardziej oddalasz się od głównego nurtu i / lub procesorów ogólnego przeznaczenia, tym bardziej prawdopodobne jest, że napotkasz bajty inne niż 8-bitowe. To idzie tak daleko, że niektóre wysoce przenośne oprogramowanie pozwala nawet konfigurować rozmiar. Na przykład starsze wersje GCC zawierały makro o nazwie BITS_PER_BYTE(lub coś w tym rodzaju), które konfigurowało rozmiar bajtu dla konkretnej architektury. Wierzę, że niektóre starsze wersje NetBSD mogłyby zostać uruchomione na architekturze innej niż 8 bitów na bajt.

Jeśli naprawdę chcesz podkreślić, że mówisz o dokładnej ilości 8 bitów, a nie o najmniejszej możliwej do adresowania ilości pamięci, jakkolwiek duża, to możesz użyć terminu oktet , który jest używany na przykład w wielu nowszych RfC.

Jörg W Mittag
źródło
2
Standardowe C i C ++ mają predefiniowane makro CHAR_BIT(znaleziono w limits.h), nie jestem świadomyBITS_PER_BYTE
njuffa
3

Kiedy zacząłem programować w 1960 roku, mieliśmy 48-bitowe słowa z 6-bitowymi bajtami - wtedy nie nazywali się tak, więc nazywano je znakami. Potem pracowałem na komputerze Golem z 75 bitowymi słowami i 15 bitami. Później 6 bajtów było normą, dopóki IBM nie wyszedł z 360, a obecnie bajt jest zwykle równoważny oktetowi, tj. 8 bitom danych. Niektóre urządzenia miały dodatkowe bity do wykrywania błędów i być może do korekcji błędów, ale nie były one dostępne dla oprogramowania.

Jonathan Rosenne
źródło
3

Bajt ma 8 bitów.

W odległej przeszłości istniały różne definicje słowa pamięci i bajtu. Sugestia, że ​​ta dwuznaczność jest powszechna lub powszechna w dzisiejszym życiu, jest fałszywa.

Co najmniej od końca lat siedemdziesiątych bajt ma 8 bitów. Masowa populacja komputerów domowych i PC jednoznacznie wykorzystała bajt jako 8-bitową wartość w swojej dokumentacji, podobnie jak wszystkie arkusze danych i dokumentacja dla stacji dyskietek, dysków twardych oraz PROM / EPROM / EEPROM / Flash EPROM Układy pamięci / SRAM / SDRAM, które przeczytałem w tym okresie. (I osobiście przeczytałem wiele z nich w tym czasie). Ethernet i kilka innych protokołów komunikacyjnych wyróżniają mnie jako niezwykłe w mówieniu o oktetach.

Dwuznaczność terminu bajt sama w sobie jest rzadką i niejasną rzeczą. Bardzo niewiele populacji programistów, inżynierów projektantów, inżynierów testowych, sprzedawców, inżynierów serwisowych lub przeciętnych graczy w ciągu ostatnich 30 lat lub więcej uważałoby, że oznaczałoby to coś innego niż wartość 8-bitowa, gdyby w ogóle rozpoznali to słowo .

Gdy bajt jest obsługiwany przez sprzęt, na przykład gdy jest przechowywany w układach pamięci lub komunikowany przewodowo, sprzęt może dodawać nadmiarowe dane do bajtu. Może to później pomóc w wykrywaniu błędów sprzętowych, aby można było rozpoznać i odrzucić niewiarygodne dane (np. Parzystość, suma kontrolna, CRC). Lub może pozwolić na poprawienie błędów w danych i odzyskanie danych (np. ECC). W obu przypadkach nadmiarowe dane zostaną odrzucone, gdy bajt zostanie pobrany lub odebrany do dalszego przetwarzania. Bajt pozostaje centralną wartością 8-bitową, a nadmiarowe dane pozostają nadmiarowymi danymi.

TonyM
źródło
2

Po pierwsze, samouczek, do którego się odwołujesz, wydaje się dość przestarzały i wydaje się, że jest skierowany do przestarzałych wersji procesorów x86, nie podając go, więc wiele rzeczy, które tam czytasz, nie będzie zrozumiały dla innych (na przykład, jeśli twierdzisz, że że WORD ma 2 bajty, ludzie albo nie będą wiedzieli o czym mówisz, albo będą wiedzieli, że zostałeś nauczony w oparciu o bardzo przestarzałe procesory x86 i będą wiedzieli, czego się spodziewać).

Bajt to dowolna liczba bitów, którą ktoś zdecyduje, że powinien być. Może to być 8 bitów, 9 bitów lub 16 bitów, cokolwiek. W 2016 r. W większości przypadków bajt będzie ośmiobitowy. Aby być bezpiecznym, możesz użyć terminu oktet - oktet zawsze ma zawsze osiem bitów.

Prawdziwe zamieszanie tutaj myli dwa pytania: 1. Jaka jest liczba bitów w bajcie? 2. Jeśli chciałbym przenieść jeden bajt z jednego miejsca do drugiego lub jeśli chciałbym zapisać bajt, używając praktycznych środków fizycznych, jak mam to zrobić? Drugie pytanie jest zazwyczaj mało interesujące, chyba że pracujesz w firmie produkującej modemy, dyski twarde lub dyski SSD. W praktyce interesuje Cię pierwsze pytanie, a na drugie mówisz po prostu „no cóż, ktoś się tym zajmuje”.

Wspomniany bit parzystości jest prymitywnym mechanizmem, który pomaga wykryć, że kiedy bajt jest przechowywany w pamięci, a później bajt jest czytany, pamięć zmieniła się przez przypadek. Nie jest w tym zbyt dobry, ponieważ nie stwierdzi, że dwa bity zostały zmienione, więc zmiana prawdopodobnie pozostanie niewykryta i nie będzie w stanie rozwiązać problemu, ponieważ nie ma sposobu, aby dowiedzieć się, który z 8 bitów zmienił się , a nawet jeśli bit parzystości się zmienił.

Bity parzystości praktycznie nie są używane w tej pierwotnej formie. Dane przechowywane na stałe są zwykle chronione w bardziej skomplikowany sposób, na przykład poprzez dodanie 32-bitowej lub dłuższej sumy kontrolnej do bloku 1024 bajtów - co zajmuje znacznie mniej dodatkowej przestrzeni (0,4% w tym przykładzie zamiast 12,5%) i jest dużo rzadziej nie dowie się, kiedy coś jest nie tak.

gnasher729
źródło
Naprawdę nieaktualne: 16-bajtowy „akapit” nie był znaczącą jednostką pamięci od czasu przejścia z trybu rzeczywistego i adresowania segmentowego.
Mark
Osobiście przyjąłbym „WinAPI”, gdy ktoś mówi o bajtach 2-bajtowych WORD, co… w pewnym sensie dowodzi twojej racji, ponieważ wiele nazw typów WinAPI jest nieaktualnych, ale zachowano je dla zachowania kompatybilności wstecznej. xP
Justin Time
1

Mimo podanych tutaj naprawdę doskonałych odpowiedzi jestem zaskoczony, że nikt nie wskazał, że bity parzystości lub bity korekcji błędów są z definicji „metadanymi”, a zatem nie są częścią samego bajtu.

Bajt ma 8 bitów !

użytkownik34445
źródło
0

We współczesnym użyciu bajt ma 8 bitów kropka (chociaż historycznie miał inne definicje). Z drugiej strony, słowo danych jest tym, co dany sprzęt obsługuje jako jednostkę atomową - może to być 8 bitów, 9 bitów, 10 bitów, 12 bitów, 16 bitów, 20 bitów, 24 bity, 32 bity itp. Różne komputery systemy na przestrzeni lat miały różne rozmiary słów.

Aby wdrożyć system pamięci lub protokół transmisji, korzystne jest dodanie wykrywania / korekcji błędów, która obejmuje dodatkowe bity. Nie tworzą 9-bitowego bajtu, ponieważ, jak wspomniano powyżej, bajt ma 8 bitów.

Różne schematy dodają wykrywanie błędów i / lub korekcję na różne sposoby.

Typowe zastosowanie parzystości polega na dodaniu dodatkowego bitu do słowa transmisji, aby odbiornik mógł wykryć pojedynczy bit błędu.

Schemat, który może zapewnić jednobitową korekcję błędów, obejmuje dodanie 4 bitów ECC na 32-bitowe słowo danych. Tak się składa, że ​​jest to arytmetycznie równoważny 1 bit na bajt, ale nie może / nie działa w ten sposób. Jedno 36-bitowe słowo danych może przenosić wystarczającą ilość informacji do odzyskania po jednobitowym błędzie dla 32-bitowej przestrzeni danych.

Zenilogix
źródło
0

8 bitów. Wewnątrz procesora i klawiatury jest to 9 i 11 bitów. Dane użytkownika są reprezentowane w 8 bitach. Klawisze na klawiaturze wysyłają śpiew, który jest podzielony na 11 bitów. 1 bit początkowy, 1 bit końcowy, 1 bit parzystości i 8 bitów reprezentujących naciśnięty klawisz.

Siva
źródło
2
Czy to odpowiada na pytanie? Czy masz na myśli różne długości bajtów w jednostce centralnej i bajtów w klawiaturze? Czy „śpiewać” powinno być „ciągami” czy „strumieniami”?
Apass.Jack
Wygląda na to, że mówisz o protokole przewodowym zawierającym dane w ramkach, a nie o samych danych.
Peter Cordes
Zakładam, że „śpiewa” to „sygnały”, ja, @ Apass.Jack.
Justin Time