【问题标题】:What's the difference between a word and byte?字和字节有什么区别?
【发布时间】:2011-12-06 16:48:42
【问题描述】:

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

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

【问题讨论】:

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

标签: assembly memory hardware terminology cpu-architecture


【解决方案1】:

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

【讨论】:

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

为什么不说 8 位?

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

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

    一组 8 位称为 字节(在某些架构中不是这样的情况除外:)

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

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

    【讨论】:

    • 一组 8 位称为八位组。
    • 正确:术语 octet 被定义为明确表示 8 位序列,因为与术语字节相关的歧义。但我更喜欢byte 的声音:)
    • @tolitius:+1 表示“但我更喜欢 byte 的声音”:我强烈怀疑你并不孤单,而且对于一些利基市场来说是安全的系统,字节的“混淆”可能是 8 位以外的大小,这些天不再相关。
    【解决方案5】:

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

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

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

    【讨论】:

      【解决方案6】:

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

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

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

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

      随波逐流。您不会因为抱怨而改变 50 多年积累的 IT 术语和文化包袱。


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

      【讨论】:

      • 我以为八位字节只是字节的法语翻译,谢谢;)
      【解决方案7】:

      字节:今天,一个字节几乎总是 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 位寄存器以某种方式组合起来计算出来的。

      【讨论】:

      • 优秀的答案。我只会狡辩“[t]相比之下,这个词是处理器可以一次进行处理的最大块......”。事实上,它是最常见的比特块等等。随着时间的推移,许多架构的字长并不是最宽的,但它们通常是他们用最广泛的价值观所能做的事情受到限制。
      • 对于额外的信用,“半字节”是半字节的常用术语。它出现在早期的微型计算机 CPU 时代(例如,Intel 8080),并且总是被理解为 4 位,因为那时字节已经稳定到 8 位。
      • 今天 8 位字节已成为标准;参见 IEC 80000-13:2008。
      • @DebanjanDhar: Yes, they're unrelated. 唯一的关系是页面(AFAIK)总是字长的倍数。
      • x86(像往常一样)使事情变得复杂:在英特尔术语中,word 是 16 位,即使在默认操作数大小为 32 位(dword)和整数寄存器的现代 x86 CPU 上也是如此宽度为 64 位(qword)。 xmm 寄存器为 128 位宽(movdqa 移动双四边形)。内存总线至少为 64 位宽(并且以 64 字节的突发传输 = 一个高速缓存行),执行单元到高速缓存路径的宽度至少为 128 位,或者 256 甚至 512 位宽。无论现代 x86 的本机机器字大小是多少,它都不是 16 位,但现代 x86 仍然使用 8086 术语。
      【解决方案8】:

      事实上,在通常的用法中,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 位。
      【解决方案9】:

      字节

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

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

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

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

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

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

      单词

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

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

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

      【讨论】:

        【解决方案10】:

        无论数据表和编译器中出现什么术语,“字节”都是八位。让我们不要试图将询问者和一般性与更模糊的例外混淆,特别是因为“字节”这个词来自“八岁”这个表达。我在半导体/电子行业工作了 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 位的系统上编程 :-))
        【解决方案11】:

        似乎所有答案都假设高级语言,主要是 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 中,.word 可能是 32 位(例如 Sparc)。
        • 抱歉,AS 不是汇编程序。它是一个丑陋的、残废的、悲惨的、变异的,其唯一目标是成为 HLL 编译器的后端。
        【解决方案12】:

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

        【讨论】:

        • 不,在具有 32 位字和 8 位字节的 CPU(例如 MIPS 或 ARM)中,半字是 2 个字节。
        【解决方案13】:

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

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

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

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

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

        【讨论】:

          【解决方案14】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-02-14
            • 1970-01-01
            • 1970-01-01
            • 2015-12-14
            • 2019-11-05
            • 2011-11-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多