字和字节有什么区别?


93

我做了一些研究。一个字节是8位,而一个字是可以在存储器中寻址的最小单元。单词的确切长度会有所不同。我不明白的是拥有一个字节有什么意义?为什么不说8位呢?

我问一个教授这个问题,他说现在大多数机器都是字节寻址的,那会产生什么呢?


12
最好避免使用“单词”一词,因为它含糊不清。或者说16位字,32位字,以使其更准确...
starblue 2011年

2
增大或减小一个单词是否有利?

2
@ quest4knoledge较大的单词允许较大的指针(也称为更多的RAM),并允许快速处理较大的数字。通过在更大的块中工作,它还可以使诸如memset之类的某些操作更快。但是,字数较大的处理器在处理器中需要更多的晶体管,并且可能消耗更多的能量。
VoidStar

@VoidStar和较大的单词表示较小的地址空间,还是我感到困惑?

1
要回答“拥有字节的意义是什么”的问题-这就是历史。CPU最初不能处理大于“字节”的任何内容(早期的处理器仅处理nybble(4位),但该术语从未真正流行过)。任何笔记中的第一个cpu是Intel 8086/8088。它旨在处理围绕“字节”构建的指令,这也是为什么我们仍以xBytes(例如千兆字节)来指代内存的原因,因为可寻址内存的基本单位是字节。“ K是指千字节,第一台PC的千字节已扩展到64位-woo hoo!
Fred

Answers:


169

字节:今天,一个字节几乎总是8位。但是,情况并非总是如此,也没有“标准”或规定这一点的东西。由于8位是一个方便使用的数字,因此它已成为事实上的标准。

处理器处理数据自然大小(寄存器大小)。今天遇到的最常见的字长是8、16、32和64位,但其他大小也是可能的。例如,有一些36位机器,甚至12位机器

字节是CPU的最小可寻址单元。如果要设置/清除单个位,则首先需要从内存中获取相应的字节,将这些位弄乱,然后将该字节写回到内存中。

相比之下,该是处理器一次可进行处理(例如加法和减法)的最大比特位。这个定义有点模糊,因为某些处理器可能针对不同任务具有不同的字长(例如,整数与浮点处理)。字大小是大多数操作所使用的词。

还有一些处理器具有不同的指针大小:例如8086是16位处理器,这意味着其寄存器为16位宽。但是它的指针(地址)是20位宽,是通过以某种方式组合两个16位寄存器来计算的。


9
极好的答案。相比之下,我只会说“ [字]是处理器可以同时处理……的最大位 ”。它实际上是最常见的位块 架构的许多已经随着时间的演变有一个字大小,是不是他们最宽的,但他们往往在他们可以与他们最大值做什么限制。
罗斯·帕特森

11
为了获得额外的信誉,“半字节”是半个字节的常用术语。它出现在早期的微型计算机CPU时代(例如 Intel 8080),并且一直被理解为4位,因为到那时字节已降为8位。
罗斯·帕特森

6
今天,8位字节已成为标准。参见IEC 80000-13:2008。
user2431763

1
@DebanjanDhar:是的,它们无关。唯一的关系是页面(AFAIK)始终是字长的倍数。
DarkDust

4
x86(通常)使事情变得复杂:在Intel术语中,word即使在默认操作数大小为32位(dword)且整数寄存器宽度为64位(qword)的现代x86 CPU上,a也为16位。xmm寄存器的宽度为128位(movdqa移动双四进制)。存储器总线至少为64位宽(并且以64字节的突发传输=缓存行),并且执行单元到缓存路径的宽度至少为128位,或者为256甚至512位。不管现代x86的本机字长是多少,它都不是16位,但是现代x86仍然使用8086术语。
彼得·科德斯

16

我不明白的是拥有一个字节有什么意义?为什么不说8位呢?

除了一个字节不一定是8位的技术观点外,使用术语的原因还很简单:

  • 省力(又名懒惰)- 说“字节”比说“八位” 更容易

  • 部落主义-一群人喜欢用行话/一种私人语言将他们与其他人区分开。

只是顺其自然。您不会因为抱怨而改变50多年的IT术语和文化包accumulated。


FWIW-当您表示“独立于硬件体系结构的8位”是“八位字节”时使用的正确术语。


我以为八位字节只是字节的法语翻译,谢谢;)
Abdelouahab Pp 2013年

8

字节

我试图从C ++的角度回答这个问题。

C ++标准将“字节”定义为“可寻址数据单元,其大小足以容纳执行环境的基本字符集的任何成员。”

这意味着该字节至少包含足够的相邻位,以容纳用于实现的基本字符集。即,可能值的数量必须等于或超过不同字符的数量。在美国,基本字符集通常是ASCII和EBCDIC集,每个字符集可以容纳8位。因此,可以保证一个字节至少有8位。

换句话说,字节是存储单个字符所需的内存量。

如果要验证C ++实现中的“位数”,请检查文件“ limits.h”。它应该具有如下所示的条目。

#define CHAR_BIT      8         /* number of bits in a char */

字被定义为机器/系统可以一起处理(即一次尝试​​)的特定位数。或者,我们可以说Word定义了一次操作即可在CPU和RAM之间传输的数据量。

计算机计算机中的硬件寄存器为字大小。字长还定义了最大可能的内存地址(每个内存地址都指向一个字节大小的内存)。

注–在C ++程序中,内存地址指向内存的一个字节,而不是一个字。


6

为什么不说8位呢?

因为并非所有机器都有8位字节。既然标记了此内容C,请CHAR_BIT在中查找limits.h


6

一个字就是处理器中寄存器的大小。这意味着处理器指令(如add,mul等)位于字大小的输入上。

但是大多数现代体系结构都具有可按8位块寻址的内存,因此使用“字节”一词很方便。


因此,从某种意义上说,术语“字节”只是为了方便起见?

是的,发明该术语时,“字节”特别方便。像许多约定一样,一旦制定,它们就会持续存在。我不确定基于字节的术语是否真的会使计算机在全局中更容易理解,但这是主要的惯例,并且不希望很快改变。
VoidStar

字节是用于在文本中用作字符的单位的术语。从历史上看,字节大小从6到9位。
starblue 2011年

@starblue字符占用的空间少于单词的可能性如何?

1
@ quest4knoledge:因为内存存储在单词较小的块中。一个字是32位(在较新的计算机上是64位)。在一种处理单个字符1比1的算法中,它们仅在CPU内部时才占用整个单词,而当放回RAM中时,它们会紧密地包装在一起。
VoidStar

5

在这种情况下,单词是机器处理内存时使用的单位。例如,在32位计算机上,字长32位,而在64位上字长64位。字长决定地址空间。

在编程(C / C ++)中,单词通常由int_ptr类型表示,该类型与指针的长度相同,从而抽象了这些细节。

但是,某些API可能会使您感到困惑,例如Win32 API,因为它具有WORD(16位)和DWORD(32位)之类的类型。原因是该API最初以16位计算机为目标,然后移植到32位计算机,然后移植到64位计算机。要存储指针,可以使用INT_PTR这里这里有更多细节。


4

似乎所有答案都使用高级语言,主要是C / C ++。

但是这个问题被标记为“汇编”,在我所知道的所有汇编器中(对于8位,16位,32位和64位CPU),定义都更加清楚:

byte  = 8 bits 
word  = 2 bytes
dword = 4 bytes = 2Words (dword means "double word")
qword = 8 bytes = 2Dwords = 4Words ("quadruple word")

3
不,这些大小仅在16位计算机上有效。您可能已经习惯了Windows编程,该编程仍然使用这些宏,因为它是16位以来的传统,MS并没有费心去纠正此问题。
DarkDust

2
顺便说一句,因为一个单词(甚至一个字节)的大小可能会有所不同,所以如果要使用特定位大小的变量/参数,ISO-C具有int<X>_tuint<X>_t类型(以及更多)。
DarkDust

@DarkDust我们在这里谈论汇编语言。C标准不相关。顺便说一句,我是1980年的程序集,使用了相同的名称。(嗯,也许除了qword之外)
johnfound

但是,我确实发现了一个例外:在GNU中,.word可能是32位(例如对于Sparc)。
DarkDust

抱歉,AS不是汇编器。它是一个丑陋,残酷,惨淡的变体,其创建的唯一目的是成为HLL编译器的后端。
johnfound

3

单词的确切长度会有所不同。我不明白的是拥有一个字节有什么意义?为什么不说8位呢?

即使一个字的长度有所不同,但在所有现代机器上,甚至在我熟悉的所有较旧的体系结构上,字的大小仍然是字节大小的倍数。因此,相对于可变字长,在“ 8位”上使用“字节”没有特别的缺点。

除此之外,还有一些在“ 8位” 上使用字节(或八位字节1)的原因:

  1. 较大的单位只是为了避免很大或很小的数字就很方便:您最好问“为什么说0.000000003秒时说3纳秒”或“为什么说1000克时为什么说1公斤”,等等。
  2. 除了便利之外,字节的单位在某种程度上与1 一样重要,因为许多操作通常不是在字节级别,而是在字节级别:寻址内存,分配动态存储,从文件或套接字读取等等。
  3. 即使您采用“ 8位”作为一种单位类型,因此您可以说“两个8位”而不是“两个字节”,但是让新单元以数字开头通常会非常令人困惑。例如,如果有人说“一百个八位”,它很容易解释为108位,而不是100位。

1尽管我将这个答案的字节视为8位,但这并不是普遍适用的:在较旧的计算机上,字节的大小可能有所不同(例如6位。无论机器是什么,八位字节始终表示8位(因此在现代用法中,字节被压倒性地用作8位的同义词。


2

无论数据表和编译器中使用什么术语,“字节”都是八位。让我们不要试图将询问者和一般性与更晦涩的例外相混淆,尤其是当“字节”一词来自“八分之一”这一表达时。我在半导体/电子行业工作了三十多年,从来没有人知道“字节”用来表示超过八位的内容。


异常是(我们知道。一个例子是,德州仪器c54x谷歌德州仪器c54x字节。ti.com/lit/ug/spru393/spru393.pdf “'C55x指令的字节长度可变,范围从8位到48位。” stackoverflow.com/questions/2098149/…–
barlop

1
它根本不是来自那里。这个词实际上是1950年代后期由W. Buchholtz在IBM提出的。资料来源:bobbemer.com/BYTE.HTM。根据鲍勃·贝默(Bob Bemer)的说法,拼写“字节”的选择优先于“叮咬”,以避免由于拼写错误而引起混淆(与“比特”混淆)。他会知道的。他在那!
斯蒂芬·C

(只有30年了?您不过是一个轻而易举的疯子。我学会了在自然的“字节”大小不是8位的系统上编程:
Stephen C

1

参考:https : //www.os-book.com/OS9/slide-dir/PPT-dir/ch1.ppt

计算机存储的基本单位是位。一个位可以包含两个值之一(0和1)。计算机中的所有其他存储都基于位的集合。给定足够的位数,令人惊讶的是,计算机可以代表多少种东西:数字,字母,图像,电影,声音,文档和程序,仅举几例。一个字节是8位,在大多数计算机上,它是最小的方便存储块。例如,大多数计算机没有指令来移动一位,但是有一条指令来移动字节。不太常见的术语是单词,它是给定计算机体系结构的本机数据单位。一个字由一个或多个字节组成。例如,具有64位寄存器和64位存储器寻址的计算机通常具有64位(8字节)字。计算机以其本机字大小而不是一次执行一个字节来执行许多操作。电脑存储 连同大多数计算机吞吐量一样,通常以字节和字节集合为单位进行测量和操作。千字节(KB)是兆字节1,024字节,兆字节(MB)是1,024 2字节千兆字节(GB)是1,024 3字节(TB),即TB,是1,024 4字节(PB),即PB,是1,024 5字节。制造商经常将这些数字四舍五入,并说兆字节为100万字节,千兆字节为10亿字节。网络测量是该一般规则的例外;它们以位为单位给出(因为网络一次只移动数据一点)024 5字节计算机制造商经常将这些数字四舍五入,说兆字节是100万字节,千兆字节是10亿字节。网络测量是该一般规则的例外;它们以位为单位给出(因为网络一次只移动数据一点)024 5字节计算机制造商经常将这些数字四舍五入,说兆字节是100万字节,千兆字节是10亿字节。网络测量是该一般规则的例外;它们以位为单位给出(因为网络一次只移动数据一点)


-1

如果机器是字节可寻址的,并且一个字是可以在内存中寻址的最小单元,那么我想一个字就是一个字节!


是的 TMS320C54xx(德州仪器(TI)的DSP之一)上的最小存储器可寻址单元为16位长,这也是其通用寄存器的最小大小。TI C编译器在其上定义了char = short = int = 16位。
阿列克谢·弗伦兹

不,大多数RISC机器都有32位字,但是可以寻址单个字节。例如,在MIPS上,word 绝对意味着32位,但是有一个lb(加载字节)指令加载8位。
彼得·科德斯

-1

对于某些体系结构,一组8位称为一个字节(但不是:)

是由处理器的指令集和/或硬件作为一个单元来处理的比特的固定大小的组。这意味着通用寄存器的大小(通常大于一个字节)是一个字

在C语言中,一个单词通常被称为整数=>int


7
一组8位称为八位位组。
cnicutar 2011年

2
正确:由于与术语byte相关联的歧义性,该术语octet被定义为明确表示8位序列。但我喜欢byte更好的声音:)
tolitius

2
@tolitius:+1表示“但我喜欢byte更好的声音”:我强烈怀疑您并不孤单,对于某些利基系统来说并不安全,一个字节的“混乱”可能不是8位大小这些天不再相关。
约阿希姆·绍尔

-1

BYTE和WORD的术语与所引用的处理器的大小有关。最常见的处理器是8位,16位,32位或64位。这些是处理器的WORD长度。实际上,无论数字长度是多少,WORD的一半都是BYTE。为此,BYTE的一半是可口的。


不可以,在具有32位字和8位字节(例如MIPS或ARM)的CPU中,半个字为2个字节。
彼得·科德斯

-3

实际上,在通常的用法中,单词已成为16位的同义词,就像字节具有8位的含义一样。由于32位CPU上的“字长”为32位,因此可能会引起一些混乱,但是当谈论一个数据字时,它的意思是16位。具有32位字长的微控制器已将其指令称为“ longs”(据说是为了避免字/双字混淆)。


1
这完全取决于CPU类型。如您所指出的,在32位非IA32机器上,“字”通常为32位。
罗斯·帕特森

2
@RossPatterson这完全取决于您是开发软件还是吃晚饭。
工程师

ARM / MIPS /其他主流RISC架构具有32位字。它是寄存器宽度(在那些ISA的32位版本上)和指令宽度。16位是一个半字,因此ARM指令喜欢ldrh加载16位并将其零扩展到32位寄存器中。或ldrsh加载并符号扩展16位。
彼得·科德斯
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.