Bir bayt 8 bit veya 9 mu içeriyor?


56

Bu derleme programlama dersinde 8 bitin veri için kullanıldığını, 1 bitlik parite için olduğunu, sonra da parite hatasını (donanım arızası veya elektriksel bozulma nedeniyle) tespit etmek için kullanıldığını okudum .

Bu doğru mu?


5
Bkz cs.stackexchange.com/a/19851/584 bir şeyin bir tartışma için bayt olabilir.
AProgrammer

63
Bu makale saçmalıklarla dolu ve onu görmezden gelmelisin.
David Schwartz

12
Pedantik olmak istiyorsanız, sadece "sekizli" olarak adlandırın. Bu makale çok özel bir işlemci ile yazılmıştır (bir sebepten dolayı ROM'da eşlik bitlerini tutması gereken…) ya da sadece zordur. Örneğin, mikroçip PIC'ler 14 bitlik bir kelime uzunluğu kullanırlar. Tüm program hafızası bir N x 14 bit dizisinde düzenlenmiştir.
Nick T,

13
@NickT: Yine de aynı şeyler değil. Bir sekizli her zaman 8 bit, bir bayt herhangi bir şey olabilir.
Jörg W Mittag

4
Bu makale, bazı eski IBM PC'lerde kullanılan bellek düzeltme mekanizmalarına atıfta bulunuyor olabilir, ancak "bayt 8 bit veri + 1 bit paritesi" olduğunu belirtir saçma. Örnek olarak, CD-ROM'lar genellikle daha açgözlü olan hata düzeltme mekanizmalarını kullanır - tipik bir ses CD'si 24 bayt ses verisi için 8 bayt kullanır. Fakat en önemli kısım umrunda değil . Hiç. Gerçek bellek depolama mekanizmasına özeldir - CPU umursamıyor, kodunuz umursamıyor.
Luaan

Yanıtlar:


79

Bir veri baytı sekiz bittir, işletim sisteminde veya hatta donanım düzeyinde hata kontrolü için kullanılan veri bayt başına daha fazla bit olabilir (eşlik biti veya daha gelişmiş bir hata tespit şeması), ancak veri sekizdir bit ve herhangi bir eşlik biti genellikle yazılım tarafından görünmez. Bir bayt, 'sekiz bit veri' anlamına gelmek üzere standardize edilmiştir. Metin, sekiz bit veriden daha büyük bir veri baytını depolamak için daha fazla bit olabileceğini söylerken yanlış değildir, ancak genellikle baytın bir parçası olarak kabul edilmeyenler, metnin kendisidir.

Bunu, öğreticinin aşağıdaki bölümünde görebilirsiniz:

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

4 * 8 = 32, aslında sistemde 36 bit alabilir ancak amaçlarınız ve amaçlarınız için sadece 32 bit.


5
Peki, eğer donanım hata tespitini gerçekleştirirse, muhtemelen 512 bayt sektörler gibi bir bayttan daha büyük bellek parçalarıyla yapar, bu şekilde gereken ekstra bellek yükünü azaltabilirsiniz. Sadece açıklığa kavuşturmak için: hata düzeltmede bile donanım hala bayt başına 8 bit ve artı her bir "yığın" için muhtemelen tek bir bayttan çok daha büyük olan bazı bitler kullanıyor.
Bakuriu

11
Yazılım tarafından görülebilen 8 bit olmayan baytlı sistemler bulunduğunu unutmayın. Bkz 8 bit Char dışında bir şey var hangi platformlar? StackOverflow'ta soru.
Ruslan

3
Evet, gerçekten varlar. Bu bağlantı 8 bitlik olmayan karakterlerden bahsediyor olsa da. Olduğu gibi: bayt, belirli bir sistemin altı bit kadar düşük bir 'char' depolamak için aldığı bit sayısını ifade ediyordu. Ancak IIRC, IEC-80000 teknik özelliklerinde bir baytın 8 bit olduğu standartlaştırılmıştır. Ana akım sistemlerden uzaklaştıkça, elbette tuhaflıklar buluyorsunuz ve standartlar kanun değil.
JustAnotherSoul,

3
@JustAnotherSoul: Baytı "en az 8 bit" olarak tanımlayan veya başka şekillerde rekabet eden standartlar var. Yıllarca sonra bayt tanımının insanların kafasında değiştiğini görmek ilginçtir. Çok daha fazla mimari heterojenite baytı zamanında, mimarinizin en küçük adreslenebilir birimi oldu (örnekler için çeşitli PDP'lere bakın). Bu aynı zamanda internet gelişiyle terimi nedeni sekizli olarak, tel üzerindeki verileri tanımlamak için kullanılan bayt 8 bitlik bir veri yığın için evrensel bir kelime değildi.
PlasmaHH

2
@JustAnotherSoul char, C'nin (linkin ne hakkında olduğunu) tam olarak adreslenebilen en küçük bellek birimi olduğuna dikkat edin. Buna sadece char denir , fakat C Standard byte ile eşanlamlı yapar .
Ruslan

48

Geleneksel olarak, bir bayt herhangi bir boyutta olabilir ve yalnızca adreslenebilir en küçük bellek birimidir. Bugünlerde 8 bit bayt, yazılım için oldukça standart hale getirildi. JustAnotherSoul'un dediği gibi, donanım 8 bit veriden daha fazla bit depolayabilir.

FPGA'lar gibi programlanabilir mantık aygıtları üzerinde çalışıyorsanız, dahili belleğinin genellikle 9 bit parça olarak ve HDL yazarı olarak adreslenebilir olduğunu görebilirsiniz, bu 9. bit'i hata kontrolü için veya sadece daha büyük miktarları saklamak için kullanabilirsiniz "bayt" başına veri sayısı. Özel donanım için bellek yongaları satın alırken, genellikle 8 veya 9 bit adreslenebilir birim (veya 16/18, 32/36, vb.) Seçeneğiniz vardır ve ardından 9 bit "bayt" olup olmadığına bağlıdır. eğer seçmeyi tercih edersen, o 9. bit ile yaparsın.


10
Genellikle, mantıksal olarak tek bir birim olan, ancak 8 bitten daha az / az veri içeren bir veri grubu olduğunda, buna "kelime" denir. Örneğin, bazı işlemciler 40 bitlik bir talimat sözcüğü kullanır.
Devsman

3
+1. Bu arada, hem "bit işaretçiler" hem de "bayt işaretçiler" ile mimariler olmuştur. Bu tür mimarilerde, bir bayt teknik olarak “en küçük adreslenebilir bellek birimi” değildir (her biti bağımsız olarak adresleyebildiğinizden beri), ancak ne olduğunu kesin olarak söylemek zor . Sanırım "Gördüğümde biliyorum" gibi bir şey. :-P
16'da

18
"Octet", geleneksel olarak kullanılan ve "bayt diyeceğim, ama farklı bayt boyutlarına sahip sistemler arasındaki çeşitli iletişim protokolleri için gerçekten tam olarak 8 bit demek" anlamına geliyordu. Ancak bu günlerde, 8 bitten başka bir şey ifade etmek için byte kullanmak aachronistic
16'da

@Devsman Zorunlu değil. x86 yongaları örneğin 32 bit kelimeye ve 8 bit bayta sahip. Bir bayt, adreslenebilir en küçük boyuttur. Kelime biraz belirsiz tanımlanmıştır, ancak çalışmak için en uygun boyutta olma eğilimindedir; yani çoğu komutun beklenen işlenen uzunluğu.
Ray

Bu doğru cevap olarak işaretlenmelidir, daha doğrudur.
awiebe

32

Bu metin son derece kötü ifade edilir. Neredeyse kesinlikle ECC (hata düzeltme kodu) RAM hakkında konuşuyor .

ECC ram yaygın olarak 9 bit kullanarak 8 bitlik bilgi depolar. Ekstra bayt biti, hata düzeltme kodlarını saklamak için kullanılır.

ECC vs ECC olmayan (Her iki durumda da, her bayt her çipin üzerine yayılmıştır. Puget Systems izniyle )

Tüm bunlar donanım kullanıcıları tarafından tamamen görünmez. Her iki durumda da, bu RAM'ı kullanan yazılım bayt başına 8 bit görür.


Bir kenara olarak: RAM'deki hata düzeltme kodları genellikle bayt başına 1 bit değildir; bunun yerine 8 bayt başına 8 bit. Bu ek yükü aynı alana sahiptir, ancak bazı ek avantajları vardır. Daha fazla bilgi için SECDED'e bakınız .


12
Parite RAM ve ECC RAM farklı şeylerdir. Parity RAM, her hata etki alanı için bir bit daha depolar, tüm tek bit hatalarını algılayabilir ve çift bit hataları olmadan algılayabilir ve hiçbir şeyi düzeltemez. ECC, hata alanı başına birkaç ek bit saklar, tüm tek bit hatalarını algılayabilir ve düzeltebilir, tüm çift bit hatalarını tespit edebilir ancak düzeltemez ve daha büyük hatalar yakalayabilir. Bu günlerde eşlik RAM nadirdir, neredeyse tamamen ECC RAM ile değiştirilmiştir.
Mark

1
@Mark: Son paragrafımda bağlantıda daha fazla ayrıntı olduğunu ima ettim. Eşlik RAM'i temelde bugünlerde mevcut değildir, çünkü (72,64) bir hata düzeltme kodu (9,8) eşlik kodu ile aynı ek yüke sahiptir.
BlueRaja - Danny Pflughoeft,

7
Ona ipucu verirken, aynı zamanda kesin olmayan / kafa karıştırıcı yapan şeyleri de belirtirsiniz. ECC RAM "9 bit kullanarak 8 bitlik bilgi saklamıyor". Bunun mümkün olmadığını 9 bit kullanarak 8 bit için ECC yapabileceğinizi belirtir. Ayrık 8 bitlik bilgiye İçin 1 ilave bit yeterlidir algılamak , doğru değilse, tek bitlik hataları. ECC'ler, genellikle tek bir bayttan büyük olan veri grupları için hataları düzeltmek için yeterli veriyi içermek üzere daha fazla sayıda bit veya bayt kullanır. Bu , 8 bit başına ortalama bir bit ortalama olabilirken, her 8 bit için yalnızca 1 bitin ilişkilendirilmesiyle parçalanamaz.
Makyen

Tek bit hata düzeltmesine ve iki bit hata algılamasına izin veren 36 bit şema (32 bit kelime + 4 bit ECC) vardır. Aritmetik olarak 8 veri bitine + 1 ECC bitine bölebilirsiniz, ancak bu şekilde çalışamaz / çalışmaz. 32 veri bitini kapsayan tam 4 bit ECC gereklidir.
Zenilogix

@ Zenilogix ve aynı şeyi tekrarlayan diğerleri: ECC'nin nasıl çalıştığını çok iyi anladım ve söylediğim hiçbir şey yanlış değildi. 8 bit ECC'nin 9 bitle yapılabileceğini iddia etmedim, ECC RAM'in depo başına 9 bit kullandığını söyledim. ECC'nin nasıl çalıştığı bu soru için tamamen kapsam dışı, bu yüzden detayları bir kenara ayırdım. Lütfen tüm bilgili yorumları durdurun.
BlueRaja - Danny Pflughoeft

16

Genel olarak konuşursak, kısa cevap bir bayt 8 bittiğidir. Bu, meseleyi basitleştiriyor (bazen yanlışlık noktasına bile), ancak çoğu insanın (çok sayıda programcı dahil) aşina olduğu ve neredeyse herkesin varsayılan olduğu (ne kadar farklı boyutlu baytlar olduğuna bakılmaksızın) tanımı çalışmak zorunda kaldım).

Daha spesifik olarak, bir bayt, verilen mimari için en küçük adreslenebilir hafıza birimidir ve genellikle tek bir metin karakterini tutacak kadar büyüktür. Çoğu modern mimaride, bir bayt 8 bit olarak tanımlanır; ISO / IEC 80000-13 aynı zamanda popüler bir fikir birliğinde olduğu gibi bir baytın 8 bit olduğunu da belirtir (yani eğer 9-bit bayttan bahsediyorsanız, açıkça belirtmediğiniz sürece çok fazla sorun yaşayacağınız anlamına gelir) normal bayt demek istemediğinizi belirtin).

Ancak, bu kuralın istisnaları vardır. Örneğin:

Bu nedenle, çoğu durumda, bir bayt genellikle 8 bit olacaktır. Değilse, muhtemelen 9 bittir ve 36 bitlik bir kelimenin parçası olabilir veya olmayabilir.


8

Bayt teriminin bağlamsız iyi tanımlanmadığını unutmayın. Bilgisayar mimarileri söz konusu olduğunda, en azından modern mimariler için bir baytın 8 bit olduğunu varsayabilirsiniz. Bu büyük ölçüde, bayt başına en az 8 bit olması gereken ancak daha büyük baytlar için herhangi bir garanti sağlamayan, bayt başına 8 bit yapan tek güvenli varsayım olan C gibi programlama dilleri ile standartlaştırılmıştır .

Adreslenebilir birimleri 8 bitten (genellikle 16 veya 32) büyük olan bilgisayarlar var, ancak bu birimlere genellikle makine baytları denir, bunlar makine kelimeleridir. Örneğin, 32K 32 bit RAM kelimeleri olan bir DSP'nin 32 KB değil 128 KB veya RAM olduğu ilan edilir.

İletişim standartları söz konusu olduğunda işler çok iyi tanımlanmamıştır. ASCII hala yaygın olarak kullanılmaktadır ve 7 bit bayta sahiptir (bilgisayarlarda 8 bit bayta güzel bir şekilde uyar). UART alıcı-vericileri hala yapılandırılabilir bayt boyutuna sahip olarak üretilir (genellikle bayt başına en az 6, 7 ve 8 bit seçersiniz, ancak 5 ve 9 duyulmaz).


6

Bir bayt genellikle, ayrı ayrı adreslenebilir bellek alanı birimi olarak tanımlanır. Herhangi bir boyutta olabilir. 6 ile 9 bit arasında, belki daha da büyük olan bayt boyutlarında mimariler var. Adreslenebilir tek birimin veriyolunun büyüklüğü olduğu mimariler de vardır, bu tür mimarilerde ya sadece bayt olmadıklarını söyleyebiliriz ya da bayt kelimesiyle aynı büyüklüktedir (bildiğim bir durumda 32 bit olmak); Her iki durumda da, kesinlikle 8 bit değil. Aynı şekilde, bit adreslenebilir mimariler de vardır, bu mimariler üzerinde, yine de baytların var olmadığını ya da baytların 1 bit olduğunu iddia edebiliriz; Her iki yol da mantıklı bir tanım, ancak 8 bit kesinlikle yanlıştır.

Birçok genel amaçlı genel mimaride, bir bayt 8 bit içerir. Ancak, bu garanti edilmez. Ana akımdan ve / veya genel amaçlı CPU'lardan ne kadar uzakta olursanız, 8 bitlik baytlarla karşılaşmama ihtimaliniz o kadar yüksektir. Bu kadar ileri gider ki, bazı taşınabilir yazılımlar bile boyutu yapılandırılabilir hale getiriyor. Örneğin, GCC'nin eski sürümleri, BITS_PER_BYTEbelirli bir mimari için bir baytın boyutunu ayarlayan bir makro (veya buna benzer bir şey) içeriyordu. NetBSD'nin bazı eski sürümlerinin bayt başına 8 bit olmayan mimarilerde çalıştırılabileceğine inanıyorum.

Gerçekten, adreslenebilir en küçük bellek miktarından ziyade tam olarak 8 bit hakkında konuştuğunuzu vurgulamak istiyorsanız, bu kadar büyük olsa da, örneğin birçok yeni RfC'de kullanılan octet terimini kullanabilirsiniz .


2
Standart C ve C ++ önceden tanımlanmış bir makroya sahiptir CHAR_BIT(içinde bulunur limits.h), bilmiyorumBITS_PER_BYTE
njuffa

3

1960’da programlamaya başladığımda, 6 bit bayt ile 48 bit kelimemiz vardı - onlar bu ismi aramamışlar, karakter olarak adlandırılıyorlardı. Sonra Golem bilgisayarında 75 bit kelime ve 15 bit bayt ile çalıştım. Daha sonra, IBM 360 ile çıkana kadar 6 bit bayt normdu ve günümüzde bir bayt genellikle bir sekizli, yani 8 bit veriye eşdeğerdir. Bazı donanımlarda hata tespiti ve muhtemelen hata düzeltmesi için ek bitler vardı, ancak bu yazılım tarafından erişilebilir değildi.


3

Bir bayt 8 bittir.

Uzak geçmişte, bir bellek kelimesi ve bir baytın farklı tanımları vardı. Bu belirsizliğin günümüz hayatında yaygın veya yaygın olduğu önerisi yanlıştır.

En azından 1970'lerin sonlarından bu yana bir bayt 8 bit olmuştur. Ev bilgisayarlarının ve PC'lerin kitlesel popülasyonu, tüm veri sayfalarını ve disket sürücüleri, sabit disk sürücüleri ve PROM / EPROM / EEPROM / Flash EPROM ile ilgili tüm dokümanları olduğu gibi, belgelerinde 8-bitlik bir değer olarak açıkça kullanmıştır. / SRAM / SDRAM bellek yongaları o dönemde okudum. (Ve o zaman zarfında kişisel olarak çok şey okudum.) Ethernet ve birkaç diğer iletişim protokolü oktetlerden bahsetme konusunda olağandışı olarak göze çarpıyor.

Bayt teriminin belirsizliği, nadir ve belirsiz bir şeydir. Son 30 yıl veya daha fazla programcı, tasarım mühendisleri, test mühendisleri, satış görevlileri, servis mühendisleri veya ortalama bahisçilerin sayısının çok az olması, kelimeyi hiç tanımadıkları takdirde 8 bitlik bir değerden başka bir anlama geleceğini düşünür .

Bir bayt, bellek yongalarında depolandığı veya kablo ile iletildiği gibi donanım tarafından işlendiğinde, donanım bayta yedek veriler ekleyebilir. Bu daha sonra, güvenilir olmayan verilerin tanınması ve atılabilmesi için donanım hatalarının tespit edilmesine yardımcı olabilir (örneğin parite, sağlama toplamı, CRC). Veya verilerdeki hataların düzeltilmesine ve verilerin kurtarılmasına izin verebilir (örn. ECC). Her iki şekilde de, gereksiz veriler bayt alındığında veya daha ileri işlemler için alındığında atılır. Bayt, merkezi 8 bitlik değer olarak kalır ve yedek veri, yedek veri olarak kalır.


2

İlk olarak, referansta bulunduğunuz eğitim oldukça modası geçmiş gibi görünüyor ve belirtmeden x86 işlemcilerin modası geçmiş sürümlerine yönelik görünüyor, bu nedenle okuduğunuz birçok şey başkaları tarafından anlaşılmayacak (örneğin, iddia ediyorsanız) Bir WORD 2 bayttır, insanlar ya ne hakkında konuştuğunuzu bilmeyecekler ya da çok eski olmayan x86 işlemciler temelinde size öğretildiğini ve ne bekleyeceğini bileceklerdir).

Bir bayt, birisinin olması gerektiğine karar verdiği bit sayısıdır. 8 bit ya da 9 bit ya da 16 bit olabilir. 2016 yılında, çoğu durumda bir bayt sekiz bit olacaktır. Güvende olmak için octet terimini kullanabilirsiniz - bir octet her zaman, her zaman sekiz bittir.

Buradaki gerçek karışıklık iki soruyu karıştırıyor: 1. Bir bayttaki bit sayısı nedir? 2. Bir byte'ı bir yerden başka bir yere aktarmak istersem veya bir byte saklamak isteseydim, pratik fiziksel araçları kullanarak bunu nasıl yapardım? Modemler, sabit diskler veya SSD sürücüleri yapan bir şirkette çalışmadığınız sürece, ikinci soru genellikle sizi ilgilendirmez. Uygulamada ilk soruya ilgi duyuyorsunuz ve ikincisi için sadece "birileri daha sonra bakar" diyorsunuz.

Bahsedilen eşlik biti, bir bayt bellekte depolandığında ve bayt okunduğunda hafızanın bir kaza sonucu değiştiğini tespit etmeye yardımcı olan ilkel bir mekanizmadır. Bu o kadar da iyi değil, çünkü iki bitin değiştirildiğini bulamayacak, bu yüzden bir değişimin tespit edilemeyeceği muhtemel ve problemden kurtulamıyor çünkü 8 bitin hangisinin değiştiğini bulmanın bir yolu yok , veya eşlik biti değişmiş olsa bile.

Parite bitleri pratikte bu ilkel biçimde kullanılmaz. Kalıcı olarak depolanan veriler genellikle daha karmaşık şekillerde korunur, örneğin 1024 baytlık bir bloğa 32 bit veya daha uzun sağlama toplamı ekleyerek - çok daha az ek alan kaplar (bu örnekte% 12,5 yerine% 0,4) ve çok daha fazla olur bir şeyin yanlış olduğunu öğrenmeme olasılığı düşüktür.


Gerçekten modası geçmiş: 16-byte "paragraf", gerçek moddan ve bölümlenmiş adresleme anahtarından bu yana anlamlı bir bellek birimi olmamıştır.
Mark

Şahsen, birileri 2 baytlık konuştuğunda "WinAPI" yi kabul ediyorum WORD, ki bu ... ... amacınızı ispatlıyor, çünkü WinAPI tipi isimlerinin çoğu eski ve geriye dönük uyumluluk için saklanıyor. xP
Justin Time

1

Burada verilen mükemmel cevaplara rağmen, hiç kimsenin parite bitlerinin veya hata düzeltme bitlerinin tanım olarak 'meta veriler' olmadığına ve baytın kendisinin bir parçası olmadığına işaret etmediğine şaşırdım .

Bir bayt 8 bit !


0

Modern kullanımda, bir bayt 8 bit, periyot (tarihsel olarak başka tanımları olmasına rağmen). Öte yandan, bir veri kelimesi, söz konusu donanımın atomik bir birim olarak ele aldığı şey ne olursa olsun - 8 bit, 9 bit, 10 bit, 12 bit, 16 bit, 20 bit, 24 bit, 32 bit, vb. Olabilir. Çeşitli bilgisayar Yıllar geçtikçe sistemler her çeşit farklı kelime boyutuna sahipti.

Bir bellek sistemi veya iletim protokolü uygulamak için, ek bitleri içeren hata tespit / düzeltme eklemek yararlıdır. 9 bitlik bir bayt yapmazlar, çünkü yukarıda belirtildiği gibi bir bayt 8 bittir.

Çeşitli şemalar, çeşitli şekillerde hata algılama ve / veya düzeltme ekler.

Tipik eşlik kullanımı, alıcının tek bir hata biti algılayabilmesi için iletim kelimesine fazladan bir bit eklemektir.

Tek bit hata düzeltmesi sağlayabilen bir şema, 32 bit veri kelimesi başına 4 ECC bitinin eklenmesini içerir. Bu sadece bayt başına 1 bit'e aritmetik olarak eşdeğer olur, ancak bu şekilde çalışamaz / çalışmaz. 36 bitlik bir veri sözcüğü, 32 bitlik bir veri alanı için tek bir hatadan kurtulmak için yeterli bilgiyi taşıyabilir.


0

8 bit. CPU ve klavyenin içinde, 9 ve 11 bit. Kullanıcı verileri olsa da 8 bit ile temsil edilir. Klavyedeki tuşlar 11 bit'e ayrılmış şarkıları gönderir. 1 başlangıç ​​biti, 1 biten biti, 1 parite biti ve bir tuşa basılmasıyla 8 bite basıldı.


2
Bu soruya cevap veriyor mu? CPU'da byte ve klavyede byte için farklı uzunlukları mı kastediyorsunuz? "Sings" "string" mi, yoksa "streams" mı olmalı?
Apass.Jack 20:18

Gerçek verilerin kendisi değil, veri çerçeveleme de dahil olmak üzere bir tel protokolünden bahsediyor gibisiniz.
Peter Cordes

"Sings" in "sinyal" olduğunu, kendimin, @ Apass.Jack olduğunu varsayardım.
Justin Time
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.