一个字节包含8位或9位吗?


56

我在本汇编编程教程中读到,8位用于数据,而1位用于奇偶校验,然后将其用于检测奇偶校验错误(由硬件故障或电气干扰引起)。

这是真的?


5
有关字节可以是什么的讨论,请参见cs.stackexchange.com/a/19851/584
AProgrammer

63
那篇文章充满了废话,您应该忽略它。
David Schwartz

12
如果您想学究,只需将它们称为“八位位组”即可。那篇文章要么是考虑到非常具体的处理器(出于某种原因必须将奇偶校验位保留在ROM中的处理器),要么只是古怪。例如,Microchip PIC使用14位字长。整个程序存储器以N x 14位阵列的形式组织。
尼克T

13
@NickT:不过,它们不是同一回事。一个八位位组总是8位,一个字节可以是任何东西。
约尔格W¯¯米塔格

4
本文可能已经引用了某些早期IBM PC中使用的内存校正机制,但指出“字节是8位数据+ 1位奇偶校验”完全是胡说八道。例如,CD-ROM通常使用更贪婪的纠错机制-典型的音频CD每24字节音频数据将使用8字节。但是最重​​要的是你不在乎。完全没有 它是实际内存存储机制所独有的-CPU不在乎,您的代码也不在乎。
a安

Answers:


79

数据的一个字节为八位,每个字节的数据可能在操作系统甚至硬件级别使用更多位进行错误检查(奇偶校验位,或更高级的错误检测方案),但数据为八位位和任何奇偶校验位通常对于软件是不可见的。字节已标准化表示“数据的八位”。文本的正确性在于,存储一个字节的数据可能比八位数据的位数更多,但文本本身并不通常被认为是字节本身的一部分,这本身就是事实。

您可以在本教程的以下部分中看到此内容:

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

4 * 8 = 32,它实际上可能在系统上占用36位,但出于您的意图和目的,它仅为32位。


5
好吧,如果硬件实现错误检测,那么它可能会使用比字节更大的内存块来进行检测,例如使用512字节左右的扇区……以这种方式,您可以减少所需额外内存的开销。需要澄清的是:即使进行了纠错,硬件仍然使用每字节8位加上每个“块”数据一些位,这可能比单个字节大得多。
巴库里

11
请注意,有些系统具有软件可见的非8位字节。请参阅哪些平台具有8位字符以外的功能?问题在StackOverflow。
Ruslan

3
是的,它们确实存在。尽管该特定链接正在谈论非8位字符。原来是这样:字节仅用于指代给定系统用于存储“字符”的位数,该位数低至6位。但是IIRC在IEC-80000规范中标准化为一个字节为8位。当您离开主流系统时,您会发现确实很奇怪,标准不是法律。
JustAnotherSoul

3
@JustAnotherSoul:还有一些竞争标准,它们将字节定义为“至少8位”或以其他方式定义。有趣的是,人们的观念如何在几十年后改变了字节的定义。过去,更多的架构异质性字节只是架构中最小的可寻址单元(请查看各种PDP示例)。这也是在Internet出现时使用八位字节这一术语来描述在线数据的原因,因为字节对于8位数据块来说并不是通用字。
PlasmaHH

2
@JustAnotherSoul注意,char在C中(链接所指的是)恰好是内存的最小可寻址单元。它仅称为char,但是C标准使其成为byte的同义词。
罗斯兰

48

传统上,字节可以是任意大小,并且只是内存的最小可寻址单元。如今,软件的8位字节已基本标准化。正如JustAnotherSoul所说,硬件存储的位数可能比8位数据的位数还要多。

如果您在使用可编程逻辑器件(例如FPGA),则可能会看到它们的内部存储器通常可寻址为9位块,而作为HDL作者,您可以使用该第9位进行错误检查或仅存储更大的数量。每个“字节”的数据量。购买用于定制硬件的存储芯片时,通常可以选择8位或9位可寻址单元(或16 / 18、32 / 36等),然后由您决定是否具有9位“字节”以及什么内容如果选择使用第9位,就可以使用。


10
通常,当存在一组逻辑上为单个单位但包含多于/少于8位的数据时,它称为“字”。例如,某些处理器使用40位指令字。
Devsman

3
+1。附带地,已经存在具有“位指针”和“字节指针”的体系结构。在这种体系结构中,一个字节在技术上并不是“内存的最小可寻址单元”(因为您可以独立地寻址每个位),尽管很难简单地说出它什么。我猜这是一种“我一看到就知道”的东西。:-P
ruakh

18
对于可能具有不同字节大小的系统之间的各种通信协议,“ Octet”是传统上使用的单词,意为“我会称其为字节,但实际上确实是8位”。但是如今,使用字节表示除8位以外的任何内容都是不合时宜的。
wnoise

@Devsman不一定。例如,x86芯片具有32位字和8位字节。字节是最小的可寻址大小。这个词的定义比较模糊,但往往是最方便使用的大小。即大多数指令的预期操作数长度。

应该将其标记为正确答案,这是更正确的。
awiebe

32

该文本措辞极差。他几乎可以肯定地说的是ECC (纠错码) RAM。

ECC ram通常使用9位存储8位的信息。额外的每字节位用于存储纠错码。

ECC与非ECC (在两种情况下,每个字节都分布在每个芯片上。图片由Puget Systems提供

硬件用户完全看不见这一切。在这两种情况下,使用此RAM的软件每个字节都能看到8位。


顺便说一句:RAM中的纠错代码通常实际上不是每个字节1位;而是每字节1位。相反,它们是每8字节8位。这具有相同的空间开销,但具有一些其他优点。有关更多信息,请参见SECDED


12
奇偶校验RAM和ECC RAM是不同的东西。奇偶校验RAM在每个错误域中存储一个额外的位,可以检测所有单个位错误而没有双位错误,并且不能修复任何问题。ECC在每个错误域中存储许多附加位,可以检测和修复所有单位错误,可以检测但不能修复所有双位错误,并且可以捕获一些较大的错误。奇偶校验RAM如今已很少见,几乎已完全由ECC RAM取代。
标记

1
@Mark:我在上一段中暗示过,链接中有更多详细信息。由于(72,64)个纠错码与(9,8)个奇偶校验码具有相同的开销,因此这些天基本上不存在奇偶校验RAM。
BlueRaja-Danny Pflughoeft

7
当您暗示它时,您还声明了使它不精确/令人困惑的内容。ECC RAM不会“使用9位存储8位信息”。说明这意味着您可以使用9位进行8位ECC,这是不可能的。对于8位离散信息,额外的1位足以检测(而不是纠正)单个位错误。ECC使用大量位或字节来包含足以纠正数据组错误的数据,通常大于单个字节。尽管这可能平均每8位增加一个位,但不能分解为仅将1位与每8位相关联。
Makyen '16

有一个36位方案(32位字+ 4位ECC),该方案允许进行一位纠错和两位错误检测。虽然您可以将其算术划分为8个数据位+ 1个ECC位,但它不能/不能那样工作。需要ECC的全部4位,其中包括32个数据位。
Zenilogix

@Zenilogix和其他重复了同样事情的人:我非常了解ECC的工作原理,我说的没错。我从来没有说过8位ECC可以用9位完成,我说ECC RAM每字节使用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),但是这些单元通常称为机器字,而不是字节。例如,具有32K 32位RAM字的DSP将被广告为具有128 KB或RAM,而不是32 KB。

当涉及到通信标准时,事情并没有那么明确。ASCII仍被广泛使用,它具有7位字节(在计算机上恰好适合8位字节)。UART收发器仍被生产为具有可配置的字节大小(通常,每个字节至少要选择6、7和8位之间的数据,但并非闻所未闻的是5和9)。


6

通常将字节定义为存储空间的最小可单独寻址单元。它可以是任何大小。已经有一些字节大小在6到9位之间甚至更大的体系结构。在有些架构中,唯一可寻址的单元是总线的大小,在这种架构上,我们可以说它们根本没有字节,或者字节与字大小相同(在一种特殊情况下,我知道是32位);无论哪种方式,绝对不是8位。同样,存在位可寻址的体系结构,在这些体系结构上,我们可以再次争论字节根本不存在,或者我们可以争论字节为1位。任一种方法都是明智的定义,但是8位肯定是错误的。

在许多主流通用体系结构上,一个字节包含8位。但是,不能保证。您与主流和/或通用CPU的距离越远,遇到非8位字节的可能性就越大。到目前为止,某些高度可移植的软件甚至使大小可配置。例如,较旧的GCC版本包含一个称为BITS_PER_BYTE(或类似名称)的宏,该宏为特定体系结构配置了字节的大小。我相信可以使NetBSD的某些旧版本运行在非8位每字节的体系结构上。

如果您真的想强调的是要谈论的是8位的确切数量,而不是最小的可寻址内存量(无论可能多大),则可以使用术语octet,例如,在许多较新的RfC中都使用了它。


2
标准C和C ++有一个预定义的宏CHAR_BIT(位于中limits.h),我不知道BITS_PER_BYTE
njuffa

3

当我在1960年开始编程时,我们有48位字和6位字节-他们不叫这个名字,所以他们叫字符。然后,我在Golem计算机上使用了75位字和15位字节。后来,在IBM推出360之前,通常使用6位字节,如今,一个字节通常等效于一个八位位组,即8位数据。某些硬件具有用于错误检测和可能用于错误纠正的附加位,但是软件无法访问这些位。


3

一个字节是8位。

在遥远的过去,对于存储字和字节有不同的定义。这种歧义在当今生活中普遍存在或普遍存在的说法是错误的。

至少从1970年代末开始,一个字节为8位。家用计算机和PC的大众在其文档中都明确地将字节用作8位值,软盘驱动器,硬盘驱动器以及PROM / EPROM / EEPROM / Flash EPROM的所有数据表和文档也是如此我在该时间段内已读取的/ SRAM / SDRAM存储芯片。(在这段时间里,我亲自阅读了很多内容。)以太网和其他一些通信协议在谈论八位字节时对我来说很不寻常。

字节一词的含糊不清本身就是一种罕见且晦涩的事物。在过去的30年或以上的时间里,很少有程序员,设计工程师,测试工程师,销售人员,服务工程师或普通用户会认为,如果他们完全意识到8位值,则意味着除8位值以外的其他含义。 。

当字节由硬件处理时,例如存储在内存芯片中或通过导线进行通信时,硬件可以向该字节添加冗余数据。以后这可能有助于检测硬件错误,以便可以识别和丢弃不可靠的数据(例如,奇偶校验,校验和,CRC)。或者,它可能允许纠正数据中的错误并恢复数据(例如ECC)。无论哪种方式,当已检索或接收字节以进行进一步处理时,冗余数据都将被丢弃。该字节保留为中心8位值,冗余数据仍为冗余数据。


2

首先,您所参考的教程似乎已经过时,并且似乎针对的是x86处理器的过时版本,但没有说明它,因此您在此处阅读的许多内容将不会被其他人理解(例如,如果您声称(一个WORD是2个字节),人们要么不知道您在说什么,要么他们知道您是根据非常过时的x86处理器学习的,并且知道您会期望什么。

字节是任何人决定的位数。可以是8位,9位或16位。在2016年,大多数情况下一个字节为8位。为了安全起见,您可以使用术语八位位组-八位位组始终是八位。

真正的困惑是两个问题:1.字节中的位数是多少?2.如果我想将一个字节从一个地方转移到另一个地方,或者如果我想使用实际的物理方法存储一个字节,我该怎么做?除非您在制造调制解调器,硬盘驱动器或SSD驱动器的公司工作,否则第二个问题通常对您几乎没有兴趣。在实践中,您对第一个问题感兴趣,而对于第二个问题,您只是说“好吧,有人来照看”。

提到的奇偶校验位是一种原始机制,可帮助检测当将字节存储在内存中,随后再读取该字节时,由于某种偶然性,内存发生了变化。这样做不是很好,因为它不会发现两个位已被更改,因此很可能无法检测到更改,并且由于无法找出8个位中的哪个已更改,因此无法从问题中恢复。 ,或者即使奇偶校验位已更改。

奇偶校验位实际上不以该原始形式使用。永久存储的数据通常以更复杂的方式受到保护,例如,通过将32位或更长的校验和添加到1024字节的块中-占用的额外空间要少得多(本示例中为0.4%,而不是12.5%),并且不太可能发现什么时候出了问题。


确实已经过时:自从实模式和分段寻址切换以来,16字节的“段落”并不是一个有意义的内存单元。
2016年

就个人而言,当有人谈论2字节WORDs 时,我会假设为“ WinAPI” ,这...可以证明您的观点,因为许多WinAPI类型名称已过时,但为了向后兼容而保留。xP
贾斯汀时间

1

尽管给出了非常好的答案,但令我惊讶的是,没有人指出奇偶校验位纠错位是按定义的“元数据”,因此不属于字节本身。

一个字节有8位


0

在现代用法中,字节为8位周期(尽管历史上它有其他定义)。另一方面,数据字是所讨论的硬件作为原子单元处理的任何东西,可以是8位,9位,10位,12位,16位,20位,24位,32位等。各种计算机多年来,这些系统具有各种不同的字长。

为了实现存储系统或传输协议,增加涉及附加位的错误检测/纠正是有益的。它们不占用9位字节,因为如上所述,一个字节为8位。

各种方案以各种方式添加了错误检测和/或校正。

奇偶校验的典型用法是在传输字上添加一个额外的位,以便接收器可以检测到单个错误位。

可以提供单比特纠错的方案包括每个32位数据字增加4个ECC位。这恰好在算术上等效于每字节1位,但是不能/不能那样工作。一个36位数据字可以承载足够的信息,以从32位数据空间的单个位错误中恢复。


0

8位。在CPU和键盘内部,它是9位和11位。但是,用户数据以8位表示。键盘上的键发送唱歌,分为11位。1个开始位,1个结束位,1个奇偶校验位和8个代表按键的位。


2
这会回答问题吗?您对cpu中的字节和键盘中的字节使用不同的长度表示吗?“唱歌”应该是“弦乐”还是“流”?
Apass.Jack

听起来您正在谈论的是包含帧数据而不是实际数据本身的有线协议。
Peter Cordes

我会假设“唱歌”是“信号”,我自己是@ Apass.Jack。
贾斯汀时间
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.