Чи містить байт 8 біт, або 9?


56

У цьому посібнику з програмування збірки я читав, що 8 біт використовуються для даних, тоді як 1 біт - це паритет, який потім використовується для виявлення помилок паритету (викликаних апаратними несправностями або електричними порушеннями).

Це правда?


5
Дивіться cs.stackexchange.com/a/19851/584 для обговорення того, що може бути байтом .
AProgrammer

63
Ця стаття наповнена нісенітницею, і ви повинні її ігнорувати.
Девід Шварц

12
Якщо ви хочете бути педантичними, просто називайте їх "октетами". Ця стаття або написана з дуже специфічним процесором на увазі (той, який повинен зберігати паритети бітів парності в ПЗУ чомусь ...), або просто пробудити. Наприклад, для мікросхем мікросхем використовується 14-бітна довжина слова. Вся пам'ять програми організована у масиві N x 14 біт.
Нік Т

13
@NickT: хоча вони не те саме. Октет - це завжди 8 біт, байт може бути чим завгодно.
Йорг W Міттаг

4
У статті, можливо, посилаються на механізми корекції пам'яті, які використовуються на деяких ранніх комп'ютерах IBM, але вказується, що "байт - це 8 біт даних + 1 бітний паритет" - це абсолютно нісенітниця. Наприклад, компакт-диски зазвичай використовують механізми виправлення помилок, які є набагато більш жадібними - типовий аудіо компакт-диск буде використовувати 8 байт на 24 байти аудіоданих. Але найважливіша частина - це те, що вам все одно . Зовсім. Це виключно для власне механізму зберігання пам’яті - процесор не хвилює, ваш код не хвилює.
Луань

Відповіді:


79

Байт даних становить вісім біт, може бути більше біт на байт даних, які використовуються в ОС або навіть апаратний рівень для перевірки помилок (біт парності або навіть більш досконала схема виявлення помилок), але дані вісім біти та будь-який біт парності, як правило, невидимі для програмного забезпечення. Байт був стандартизований, щоб означати "вісім біт даних". Текст не є помилковим, кажучи, що може бути більше біт, присвячених зберіганню байтів даних, ніж вісім біт даних, але вони, як правило, не вважаються частиною байта, як правило, сам текст вказує на цей факт.

Ви можете побачити це в наступному розділі підручника:

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

4 * 8 = 32, це може зайняти 36 біт у системі, але для ваших намірів та цілей це лише 32 біти.


5
Що ж, якщо апаратне забезпечення реалізує виявлення помилок, воно, ймовірно, зробить це з більшими шматками пам'яті, ніж байт, як, наприклад, з 512-байтними секторами тощо. Просто для уточнення: навіть при виправленні помилок апаратне забезпечення все ще використовує 8-бітовий байт плюс кілька біт для кожного "фрагмента" даних, що, ймовірно, набагато більше, ніж один байт.
Бакуріу

11
Зауважте, що існують системи з видимими програмними не-8-бітовими байтами. Дивіться, які платформи мають щось інше, ніж 8-бітний графік? питання в StackOverflow.
Руслан

3
Так, вони дійсно існують. Хоча саме ця посилання говорить про не-8-бітових символах. Як би: байт використовувався для простого позначення кількості бітів, яку дана система потребує для зберігання "знака", яка становила шість біт. Але IIRC стандартизовано в специфікації IEC-80000, що байт становить 8 біт. Коли ви відходите від основних систем, ви, звичайно, виявляєте дивацтва, а стандарти - це не закони.
JustAbodySoul

3
@JustAbodySoul: І існують змагальні стандарти, які визначають байт як "принаймні 8 біт" або іншими способами. Цікаво побачити, як десятиліття пізніше визначення байти змінюється у свідомості людей. Ще в часи набагато більшої архітектури байт неоднорідності був просто найменшою адресальною одиницею вашої архітектури (приклади дивіться на різні PDP). Це також є причиною того, що в появі Інтернету термін октет був використаний для опису даних про дроті, оскільки байт не був універсальним словом для фрагмента 8-бітових даних.
ПлазмаHH

2
@JustAgetherSoul зауважимо, що charв C (саме про це йде посилання) - саме найменша адресна одиниця пам'яті. Це просто називається char , але стандарт C робить його синонімом байта .
Руслан

48

Традиційно байт може бути будь-якого розміру і є лише найменшою адресною одиницею пам'яті. В наші дні 8 бітових байтів майже стандартизовані для програмного забезпечення. Як сказав JustATHERSoul, обладнання може зберігати більше біт, ніж 8 біт даних.

Якщо ви працюєте над програмованими логічними пристроями, такими як FPGA, ви можете побачити, що їх внутрішня пам'ять часто адресується як 9-бітні шматки, і як автор HDL, ви можете використовувати цей 9-й біт для перевірки помилок або просто для зберігання більшої кількості даних на "байт". Купуючи мікросхеми пам'яті для користувальницького обладнання, у вас зазвичай є вибір 8 або 9 бітових адресних одиниць (або 16/18, 32/36 тощо), і тоді саме від вас залежить, чи маєте ви 9 бітових "байт" і що ви робите з цим 9-м бітом, якщо вирішите його мати.


10
Як правило, коли є група даних, яка логічно є єдиною одиницею, але містить більше / менше 8 біт, це називається "словом". Наприклад, деякі процесори використовують 40-бітове слово інструкції.
Девсман

3
+1. Між іншим, існували архітектури як з "бітовими вказівниками", так і з "байтовими вказівниками". У таких архітектурах байт технічно не є "найменшою адресною одиницею пам'яті" (оскільки кожен біт можна адресувати самостійно), хоча складно сказати, що це таке . Я здогадуюсь, що це "я знаю це, коли бачу". :-P
ruakh

18
Традиційно вживане слово "Октет" означало "я би назвав його байтом, але я дійсно маю на увазі рівно 8 біт" для різних протоколів зв'язку між системами, які можуть мати різний розмір байтів. Але в наші дні використання байта означає що-небудь, крім 8 біт, є анахронічним.
wnoise

@Devsman Не обов’язково. Наприклад, у чіпів x86 є 32 бітні слова та 8 бітні байти. Байт - найменший розмір адреси. Слово дещо невиразніше визначене, але, як правило, розмір, з яким найзручніше працювати; тобто очікувана довжина операнду більшості інструкцій.
Рей

Це слід позначити як правильну відповідь, вона більш правильну.
awiebe

32

Цей текст вкрай погано сформульований. Він майже напевно говорить про оперативну пам’ять ECC (код виправлення помилок) .

ECC баран звичайно зберігає інформацію, що вартує 8 біт, використовуючи 9-бітні. Додатковий біт на байт використовується для зберігання кодів виправлення помилок.

ECC проти non-ECC (В обох випадках кожен байт поширюється на кожен чіп. Зображення надано Puget Systems )

Це все абсолютно непомітно для користувачів обладнання. В обох випадках програмне забезпечення, що використовує цю оперативну пам'ять, бачить 8 біт на байт.


На додаток: коди, що виправляють помилки в оперативній пам’яті, насправді не є 1 бітом на байт; вони замість цього 8 біт на 8 байт. Це однаковий простір, але має додаткові переваги. Див. SECDED для отримання додаткової інформації.


12
Паритет RAM і ECC RAM - це різні речі. Паритет RAM зберігає один додатковий біт на домен помилки, може виявити всі однобітні помилки і жодних двобітних помилок, і нічого не може виправити. ECC зберігає ряд додаткових бітів на домен помилок, може виявляти та виправляти всі однобітні помилки, може виявляти, але не виправляти всі двобітні помилки, а також може фіксувати деякі більші помилки. Паритетність ОЗУ є рідкісною в наші дні, майже повністю її замінила оперативна пам'ять ECC.
Марк

1
@Mark: Я натякнув на це в своєму останньому абзаці, у посиланні є більше деталей. Оперативної пам’яті паритету в ці дні взагалі не існує, оскільки (72,64) код виправлення помилок має той же накладні витрати, як і (9,8) код парності.
BlueRaja - Danny Pflughoeft

7
Хоча ви натякаєте на це, ви також констатуєте речі, які роблять це неточним / заплутаним. Оперативна пам’ять ECC не "зберігає 8-бітну інформацію, яка використовує 9-біт". Заявляючи, що означає, що ви можете зробити ECC для 8 біт, використовуючи 9 біт, що неможливо. Для 8 біт дискретної інформації достатньо одного додаткового біта, щоб виявити , не виправити, однобітні помилки. ECC використовують більшу кількість біт або байтів, щоб містити дані, достатні для виправлення помилок для груп даних, як правило, більших, ніж один байт. Хоча це може становити додатковий біт на 8 біт, його не можна розділити на асоціювання лише 1 біта з кожніми 8 бітами.
Макіен

Існує 36-розрядна схема (32-бітове слово + 4-розрядний ECC), яка дозволяє виправити однобітну помилку та виявити дві бітові помилки. Хоча ви можете арифметично розділити його на 8 бітів даних + 1 біт ECC, він не може / не працює таким чином. Повні 4 біти ECC, які охоплюють 32 біти даних.
Zenilogix

@Zenilogix та інші, які повторювали те саме: Я дуже добре розумію, як працює ECC, і нічого, що я сказав, було невірним. Я ніколи не стверджував, що 8-бітний ECC можна зробити з 9 біт, я сказав, що оперативна пам’ять ECC використовує 9-біт на байт сховища. Те, як працює ECC, є цілком поза межами цього питання, тому я залишив деталі як осторонь із посиланням. Будь ласка, припиніть усі педантичні коментарі.
BlueRaja - Danny Pflughoeft

16

Взагалі коротка відповідь полягає в тому, що байт - 8 біт. Це надто спрощує питання (іноді навіть до неточності), але це визначення, з яким знають більшість людей (включаючи велику кількість програмістів), і дефініція майже для всіх за замовчуванням (незалежно від того, скільки байтів різного розміру вони ' мені довелося працювати).

Більш конкретно, байт - це найменший адресний блок пам'яті для даної архітектури і, як правило, досить великий, щоб вмістити один текстовий символ. У більшості сучасних архітектур байт визначається як 8 біт; ISO / IEC 80000-13 також визначає, що байт становить 8 біт, як і популярний консенсус (мається на увазі, що якщо ви говорите про, скажімо, 9-бітових байтах, ви зіткнетеся з великою проблемою, якщо не будете явно констатуйте, що ви не маєте на увазі нормальні байти).

Однак з цього правила є винятки. Наприклад:

Так, у більшості випадків байт, як правило, буде 8 біт. Якщо ні, це, ймовірно, 9 біт, а може бути, а може і не бути частиною 36-бітного слова.


8

Зауважте, що термін байт недостатньо визначений без контексту. Що стосується комп'ютерних архітектур, то можна припустити, що байт є 8-бітовим, принаймні для сучасних архітектур. Це значною мірою було стандартизовано мовами програмування, такими як C, що вимагало, щоб байти мали принаймні 8 біт, але не давали жодних гарантій для більших байтів, тому 8 біт на байт є єдиним безпечним припущенням.

Є комп'ютери з адресаційними одиницями, більшими за 8 біт (зазвичай це 16 або 32), але ці одиниці зазвичай називаються машинними словами, а не байтами. Наприклад, DSP з 32-кратними 32-бітовими словами ОЗУ рекламується як 128 КБ або ОЗУ, а не 32 КБ.

Речі не так чітко визначені, коли мова йде про стандарти спілкування. ASCII досі широко використовується, і він має 7-бітні байти (які непогано вміщуються у 8-бітових байтах на комп'ютерах). Приймачі UART все ще виробляються з можливістю налаштування розміру байтів (зазвичай ви можете вибрати принаймні між 6, 7 і 8 бітами на байт, але 5 і 9 не є нечуваними).


6

Байт зазвичай визначається як найменший індивідуально адресований блок пам'яті. Він може бути будь-якого розміру. Були архітектури з розміром байтів десь між 6 і 9 бітами, можливо, навіть і більшими. Є також архітектури, де єдиною адресною одиницею є розмір шини, для таких архітектур ми можемо або сказати, що вони просто не мають байту , або байт такого ж розміру, як слово (в одному конкретному випадку я знаю, що це бути 32 біт); в будь-якому випадку, це точно не 8 біт. Так само є бітоадректувані архітектури, на цих архітектурах ми знову можемо стверджувати, що байти просто не існують, або ми можемо стверджувати, що байти - це 1 біт; будь-який спосіб - це розумне визначення, але 8 біт, безумовно, помиляється.

У багатьох основних архітектурах загального призначення один байт містить 8 біт. Однак це не гарантується. Чим далі ви відхилитесь від основного та / або центрального процесора загального призначення, тим більше шансів натрапити на не-8-бітові байти. Це заходить так далеко, що якесь високопортативне програмне забезпечення навіть робить розмір налаштованим. Наприклад, старіші версії GCC містили макрос під назвою BITS_PER_BYTE(або щось подібне), який налаштовував розмір байта для певної архітектури. Я вважаю, що деякі старіші версії NetBSD можуть бути зроблені для роботи на не-8-бітних за байтом архітектурах.

Якщо ви дійсно хочете підкреслити, що ви говорите про точний обсяг 8 біт, а не про найменший адресований об'єм пам'яті, який би великий розмір не був, ви можете використовувати термін октет , який використовується, наприклад, у багатьох нових RfC.


2
Стандартні C і C ++ мають заздалегідь визначений макрос CHAR_BIT(знайдено в limits.h), я не знаюBITS_PER_BYTE
njuffa

3

Коли я почав програмувати в 1960 році, у нас було 48 бітових слів з 6 бітовими байтами - вони тоді не називали цього імені, їх називали символами. Тоді я працював на комп’ютері Голема з 75 бітовими словами та 15 бітовими байтами. Пізніше 6-бітові байти були нормою, поки IBM не вийшла з 360, і в даний час байт зазвичай еквівалентний октету, тобто 8 біт даних. Деякі апаратні засоби мали додаткові біти для виявлення помилок і, можливо, для виправлення помилок, але вони не були доступні програмним забезпеченням.


3

Байт - 8 біт.

У далекому минулому існували різні визначення слова пам’яті та байти. Припущення про те, що ця неоднозначність є поширеною чи поширеною в сучасному житті, є помилковим.

Принаймні з кінця 1970-х, байт склав 8 біт. Усі масові групи домашніх комп'ютерів та персональних комп'ютерів недвозначно використовували байт як 8-бітове значення у своїй документації, як і всі таблиці даних та документацію для накопичувачів дискети, жорстких дисків та PROM / EPROM / EEPROM / Flash EPROM / SRAM / SDRAM мікросхеми пам'яті, які я прочитав у той період часу. (І я особисто читав їх багато прямо за той період часу.) Ethernet та ще кілька протоколів комунікації виділяються мені як незвичні в розмові про октети.

Неоднозначність терміна байт - сама по собі рідкісна і незрозуміла річ. Дуже мало хто з населення програмістів, інженерів-дизайнерів, тестових інженерів, продавців, сервісних інженерів або середніх гравців за останні 30 років і більше вважає, що це означає щось інше, ніж 8-бітове значення, якби вони визнавали це слово взагалі .

Коли байт обробляється обладнанням, наприклад, коли він зберігається в мікросхемах пам'яті або передається по дроту, апаратне забезпечення може додавати зайві дані в байт. Пізніше це може допомогти у виявленні апаратних помилок, щоб надійні дані можна було розпізнати та відкинути (наприклад, паритет, контрольна сума, CRC). Або це може дозволити виправлення помилок у даних та відновлення даних (наприклад, ECC). У будь-якому випадку зайві дані будуть відкинуті, коли байт буде отримано або отримано для подальшої обробки. Байт залишається центральним 8-бітовим значенням, а надлишкові дані залишаються зайвими.


2

По-перше, навчальний посібник, на який ви посилаєтесь, здається досить застарілим, і, здається, спрямований на застарілі версії процесорів x86, не вказуючи його, тому багато речей, які ви там прочитаєте, інші не зрозуміють (наприклад, якщо ви заявляєте що слово має 2 байти, люди або не знатимуть, про що ви говорите, або знають, що вас навчали на основі дуже застарілих процесорів x86 і будуть знати, чого очікувати).

Байт - це будь-яка кількість бітів, хтось вирішить, що це має бути. Це може бути 8 біт, або 9 біт, або 16 біт, що завгодно. У 2016 році в більшості випадків байт складе вісім біт. Щоб бути безпечним, ви можете використовувати термін октет - октет завжди, завжди, вісім біт.

Справжня плутанина тут плутає два питання: 1. Яка кількість біт у байті? 2. Якщо я хотів перенести один байт з одного місця в інше або якщо я хотів би зберегти байт, використовуючи практичні фізичні засоби, то як би це зробити? Друге питання, як правило, мало цікавить вас, якщо ви не працюєте в компанії, яка робить модеми, жорсткі диски або SSD-накопичувачі. На практиці вас цікавить перше запитання, а за друге ви просто говорите «ну хтось за цим доглядає».

Згаданий біт парності - це примітивний механізм, який допомагає виявити, що коли байт зберігається в пам'яті, а пізніше байт читається, пам'ять змінилася випадково. Це не дуже добре, тому що не виявиться, що два біти були змінені, так що зміна, ймовірно, не виявиться, і він не може відновити проблему, оскільки немає способу дізнатися, який з 8 бітів змінився або навіть якщо біт парності змінився.

Біти парності практично не використовуються в цій примітивній формі. Дані, які постійно зберігаються, зазвичай захищаються складнішими способами, наприклад, додаючи 32-бітну або довшу контрольну суму до блоку 1024 байтів - що займає набагато менше додаткового місця (0,4% у цьому прикладі замість 12,5%) і значно менше шансів не дізнатися, коли щось не так.


Дійсно застарілий: 16-байтний "абзац" не був значущим одиницею пам'яті з часу переходу з реального режиму та сегментованої адреси.
Марк

Особисто я б припустив, що "WinAPI", коли хтось говорить про 2-байтові WORD, що ... ніби доводить вашу думку, оскільки багато назв типів WinAPI застарілі, але зберігаються для зворотної сумісності. xP
Час Джастіна

1

Незважаючи на дійсно чудові відповіді, наведені тут, я здивований, що ніхто не вказував на те, що біти парності або біти виправлення помилок за визначенням є "метаданими" і тому не є частиною самого байта.

Байт має 8 біт !


0

У сучасному використанні байт становить 8 біт, період (хоча історично він мав інші визначення). З іншого боку, слово даних є тим, що обладнання, про яке йде мова, обробляє атомну одиницю - може бути 8 біт, 9 біт, 10 біт, 12 біт, 16 біт, 20 біт, 24 біт, 32 біт і т.д. Різний комп'ютер Система протягом багатьох років мала всілякі розміри слів.

Для реалізації системи пам'яті або протоколу передачі корисно додати виявлення / виправлення помилок, що передбачає додаткові біти. Вони не роблять 9-бітовий байт, оскільки, як було сказано вище, байт становить 8 біт.

Різні схеми додають виявлення помилок та / або виправлення різними способами.

Типовим використанням парності є додавання додаткового біта до слова передачі, щоб приймач міг виявити єдиний біт помилки.

Схема, яка може забезпечити одноразове виправлення помилок, передбачає додавання 4 бітів ECC на 32-бітове слово даних. Це просто арифметично еквівалентно 1 біту на байт, але це не може / не працює таким чином. Одне 36-бітове слово даних може нести достатньо інформації для відновлення з однієї бітової помилки для 32-бітного простору даних.


0

8 біт. Всередині процесора та клавіатури він 9 і 11 біт. Дані користувача представлені у 8 бітах. Клавіші на клавіатурі надсилають співочки, які розділені на 11 біт. 1 початковий біт, 1 кінцевий біт, 1 біт парності та 8 біт, що представляють натиснуту клавішу.


2
Чи відповідає це на питання? Ви маєте на увазі різну довжину байтів на процесорі та байтів на клавіатурі? Чи повинні "співи" бути "рядками" чи "потоками"?
Apass.Jack

Здається, ви говорите про провідний протокол, включаючи кадри даних, а не самі фактичні дані.
Пітер Кордес

Я б припустив, що "співає" - це "сигнали", я, @ Apass.Jack.
Час Джастін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.