ChatGPT解决这个技术问题 Extra ChatGPT

字和字节有什么区别?

我做了一些研究。一个字节是 8 位,一个字是内存中可以寻址的最小单位。单词的确切长度各不相同。我不明白的是有一个字节有什么意义?为什么不说 8 位?

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

最好避免使用“单词”这个词,因为它有歧义。或者通过说 16 位字、32 位字、......
字大还是小有好处吗?
@quest4knoledge 更大的字允许更大的指针(也就是更多的 RAM),并允许快速处理更大的数字。通过在更大的块中工作,它还可以允许某些操作(如 memset)更快。但是,具有较大字的处理器需要处理器中的更多晶体管,并且可能会消耗更多能量。
@VoidStar 和一个更大的词意味着更小的地址空间,还是我很困惑?
要回答“拥有一个字节有什么意义”这个问题 - 这是历史。 CPU 一开始并不能处理比“字节”更大的任何东西(早期的处理器只处理 nybbles(4 位),但这个词从未真正流行起来)。任何笔记的第一个 cpu 是 Intel 8086/8088。它旨在处理围绕“字节”构建的指令,这也是我们仍然以 xBytes (例如 GigaBytes)来指代内存的原因,因为可寻址内存的基本单位是字节。 'K 是对 KiloBytes 的引用,其中第一台 PC 有 16 个,可扩展到 64 个 - 哇哦!

D
DarkDust

字节:今天,一个字节几乎总是 8 位。但是,该 wasn't always the case 并没有“标准”或规定这一点的东西。由于 8 位是一个方便使用的数字,因此它成为了事实上的标准。

Wordnatural size with which a processor is handling data(寄存器大小)。今天遇到的最常见的字长是 8、16、32 和 64 位,但其他大小也是可能的。例如,有几个 36 bit machines,甚至 12 bit machines

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

相比之下,字的一个定义是处理器一次可以进行处理(如加法和减法)的最大位块——通常是整数寄存器的宽度。该定义有点模糊,因为某些处理器可能针对不同的任务(例如整数与浮点处理)具有不同的寄存器大小,或者能够访问寄存器的一部分。字大小是大多数操作使用的最大寄存器大小。

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

在某些手册和 API 中,术语 “word” 可能会“停留”在以前的旧版大小上,并且在平台发展为支持更大的寄存器时可能与处理器的实际当前字长有所不同尺寸。例如,Intel 和 AMD x86 手册仍将 "word" to mean 16 bitsDWORD(双字,32 位)和 QWORD(四字,64 位)一起用作更大的尺寸。然后这会反映在一些 API 中,例如 Microsoft 的 WinAPI。


优秀的答案。我只会狡辩“相比之下,这个词是处理器可以一次处理的最大块......”。它实际上是最常见的位块等。随着时间的推移,许多架构的字长并不是最宽的,但它们通常在使用最宽的值时可以做的事情受到限制。
对于额外的信用,“半字节”是半字节的常用术语。它出现在早期的微型计算机 CPU 时代(例如 Intel 8080),并且一直被理解为 4 位,因为那时字节已经稳定到 8 位。
今天,8 位字节已成为标准;参见 IEC 80000-13:2008。
x86(像往常一样)使事情变得复杂:在 Intel 术语中,word 是 16 位,即使在默认操作数大小为 32 位(dword)且整数寄存器宽度为 64 位(qword)的现代 x86 CPU 上也是如此。 xmm 寄存器为 128 位宽(movdqa 移动双四进制)。内存总线至少为 64 位宽(并且以 64 字节的突发传输 = 一个高速缓存行),执行单元到高速缓存路径的宽度至少为 128 位,或者 256 甚至 512 位宽。无论现代 x86 的本机机器字大小是多少,它都不是 16 位,但现代 x86 仍然使用 8086 术语。
@Crystina:是的,更具体地说:它通常是通用寄存器的大小(例如,浮点寄存器可能有不同的大小)。
S
Stephen C

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

除了一个字节不一定是8位的技术点之外,有一个术语的原因很简单:人性:

省力(又名懒惰) - 说“字节”而不是“八位”更容易

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

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

FWIW - 当您的意思是“独立于硬件架构的 8 位”时使用的正确术语是“八位字节”。


我以为八位字节只是字节的法语翻译,谢谢;)
V
Vaibhav Patle

字节

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

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

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

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

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

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

单词

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

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

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


c
cnicutar

为什么不说 8 位?

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


V
VoidStar

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

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


所以从某种意义上说,“字节”一词只是为了方便起见?
是的,“字节”一词在发明时特别方便。像许多约定一样,一旦它们成立,它们就会持续存在。我不确定基于字节的术语是否真的让计算机在大局中更容易理解,但它是主要的约定,并且不会很快改变。
字节是用于在文本中用作字符的单位的术语。历史上存在大小从 6 位到 9 位的字节。
@starblue 一个字符占用的空间怎么可能比一个单词少?
@ quest4knoledge:因为内存存储在较小的块中。一个字是 32 位(或者在较新的机器上是 64 位)。在一个逐个处理单个字符的算法中,它们只有在 CPU 内部时才会占用一个完整的单词,而当它们放回 RAM 时,它们会被更紧密地打包。
j
johnfound

似乎所有答案都假设高级语言,主要是 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")

不,这些大小仅在 16 位机器上有效。您可能已经习惯了仍然使用这些宏的 Windows 编程,因为它是 16 位时代遗留下来的,而 MS 并没有费心去纠正这个问题。
顺便说一句,因为一个字(甚至一个字节)的大小可以变化,ISO-C 有 int<X>_tuint<X>_t 类型(加上更多),如果你想要一个特定位的变量/参数,应该使用它们尺寸。
@DarkDust 我们在这里谈论汇编语言。 C 标准不相关。顺便说一句,我从 1980 年开始编写程序集,并且使用了相同的名称。 (好吧,也许除了qword)
但是,我确实发现了一个例外:在 GNU as 中,.word 可能是 32 位(例如 Sparc)。
抱歉,AS 不是汇编程序。它是一个丑陋的、残废的、悲惨的、突变的,其唯一目标是成为 HLL 编译器的后端。
C
Community

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

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

不过,有些 API 可能会让您感到困惑,例如 Win32 API,因为它具有 WORD(16 位)和 DWORD(32 位)等类型。原因是 API 最初针对 16 位机器,然后移植到 32 位机器,然后移植到 64 位机器。要存储指针,您可以使用 INT_PTR。更多详情 herehere


B
BeeOnRope

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

尽管单词的长度各不相同,但在所有现代机器甚至我熟悉的所有旧架构上,单词大小仍然是字节大小的倍数。因此,相对于可变字长而言,在“8 位”上使用“字节”并没有特别的缺点。

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

较大的单位只是为了方便避免非常大或非常小的数字:您不妨问“可以说 0.000000003 秒,为什么要说 3 纳秒”或“可以说 1,000 克,为什么还要说 1 公斤”等。 ,字节的单位在某种程度上与 1 位一样基本,因为许多操作通常不在字节级别,而是在字节级别:寻址内存、分配动态存储、从文件或套接字读取等。即使你是采用“8 位”作为单位类型,因此您可以说“两个 8 位”而不是“两个字节”,让您的新单位以数字开头通常会很混乱。例如,如果有人说“一百个 8 位”,它很容易被解释为 108 位,而不是 100 位。

1 虽然我认为这个答案的一个字节是 8 位,但这并不是普遍正确的:在旧机器上,一个 byte 可能有不同的大小(例如6 bitsOctet 始终表示 8 位,与机器无关(因此该术语经常用于定义网络协议)。在现代用法中,字节绝大多数被用作 8 位的同义词。


B
Brendan

无论数据表和编译器中出现什么术语,“字节”都是八位。让我们不要试图将询问者和一般性与更模糊的例外混淆,特别是因为“字节”这个词来自“八岁”这个表达。我在半导体/电子行业工作了 30 多年,从来没有人知道“字节”用于表示超过 8 位的任何内容。


不寻常的是(我们知道。一个例子是,德州仪器 c54x 谷歌德州仪器 c54x 字节。ti.com/lit/ug/spru393/spru393.pdf“'C55x 指令是可变字节长度,大小从 8 位到 48 位不等。”stackoverflow.com/questions/2098149/…
它根本不是来自那里。该术语实际上是由 IBM 的 W. Buchholtz 在 1950 年代后期创造的。来源:bobbemer.com/BYTE.HTM。根据 Bob Bemer 的说法,选择拼写“byte”而不是“bite”以避免因拼写错误而混淆(与“bit”)。他会知道的。他在那儿!
(只有 30 年?你不过是个捕食者。我学会了在自然“字节”大小不是 8 位的系统上编程 :-))
L
LiLi

参考: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 是 1,024 4 字节每 PB 或 PB 是 1,024 5 字节 计算机制造商经常对这些数字进行四舍五入,并说一兆字节是 100 万字节,千兆字节是 10 亿字节。网络测量是这个一般规则的一个例外。它们以位给出(因为网络一次移动一点数据)


t
tolitius

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

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

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


一组 8 位称为八位字节。
正确:术语 octet 被定义为明确表示 8 位序列,因为与术语字节相关的歧义。但我更喜欢 byte 的声音 :)
@tolitius:+1 表示“但我更喜欢 byte 的声音”:我强烈怀疑您并不孤单,并且对于一些小众系统来说是安全的,如今,字节可能是 8 位以外的大小不再相关。
K
K-ballo

如果一台机器是字节可寻址的,而一个字是内存中可以寻址的最小单位,那么我猜一个字就是一个字节!


是的。 TMS320C54xx(德州仪器的 DSP 之一)上的最小可寻址内存单元为 16 位长,这也是其通用寄存器的最小尺寸。并且 TI C 编译器在其上定义了 char=short=int=16 位。
不,大多数 RISC 机器都有 32 位字,但 可以 寻址单个字节。例如,在 MIPS 上,word 绝对 表示 32 位,但有一个 lb(加载字节)指令可以加载 8 位。
C
Chris Calley

BYTE 和 WORD 的术语与所引用的处理器的大小有关。最常见的处理器是/曾经是 8 位、16 位、32 位或 64 位。这些是处理器的 WORD 长度。实际上,一个 WORD 的一半是一个字节,无论数字长度是多少。准备好了,半个字节是一个半字节。


不,在具有 32 位字和 8 位字节的 CPU(例如 MIPS 或 ARM)中,半个字是 2 个字节。
B
Brian Knoblauch

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


这完全取决于 CPU 类型。正如您所指出的,在 32 位非 IA32 机器上,“单词”通常是 32 位。
@RossPatterson 这完全取决于您是在开发软件还是在吃晚饭。
ARM/MIPS/其他主流RISC架构都有32位字。它是寄存器宽度(在这些 ISA 的 32 位版本上)和指令宽度。 16 位是一个半字,因此 ARM instructions like ldrh 加载 16 位并将其零扩展为 32 位寄存器。或 ldrsh 加载和符号扩展 16 位。