【问题标题】:Why does a byte only have 0 to 255?为什么一个字节只有0到255?
【发布时间】:2011-06-26 13:38:06
【问题描述】:

为什么一个字节的范围只有 0 到 255?

【问题讨论】:

  • 我认为这个问题的核心是为什么它会变为 255 而不是 256,答案是它确实包含 256 个值,它只是从零开始

标签: binary byte


【解决方案1】:

严格来说,术语“字节”实际上可以指代一个具有 256 个值以外的单位。这只是几乎通用的尺寸。来自Wikipedia

从历史上看,一个字节是 用于编码单个字符的位 在计算机中的文本,它是 这个原因基本可寻址 许多计算机中的元素 架构。

字节的大小历来 依赖于硬件并且没有 存在明确的标准 授权大小。事实上的 八位标准是一种方便 允许值 0 的 2 的幂 通过 255 为一个字节。多种类型 的应用程序使用变量 可以用八位或更少的位表示, 和处理器设计人员优化 这种常见的用法。的受欢迎程度 主要商业计算 架构有助于 普遍接受 8 位 尺寸。八位字节被定义为 明确表示一个 8 位序列 因为相关的歧义 使用术语字节。

具有讽刺意味的是,如今“单个字符”的大小在大多数情况下不再考虑单个字节......最常见的是,“字符”的概念与 Unicode 相关联,其中字符可以用不同格式的数量,但通常是 16 位或 32 位。

对于使用 UCS-4/UTF-32(Unicode 的直接 32 位表示)的系统将 32 位指定为一个字节会很有趣。造成的混乱将是惊人的。

但是,假设我们将“byte”作为“octet”的同义词,则有八个独立的bits,每个bits可以是on或off,true或false,1或0,但你想怎么想它。这导致 256 个可能的值,通常编号为 0 到 255。(但情况并非总是如此。例如,Java 的设计者不幸决定将字节视为 -128 范围内的 有符号 整数到 127。)

【讨论】:

  • 太糟糕了 C 选择使用 char 作为字节类型,这意味着 char 不是字符。
  • @Jon:我不应该说 Unicode(21 位字符集)通常由 16 位或 32 位表示!这是一个非常以 Java/Microsoft 为中心的观点!首先,愚蠢的旧 UCS-2 只有 16 位。虽然 UTF-16 确实可以序列化为 16 位或 32 位,但远远超出最常见的编码方案,对于 Unicode 文本,没有一个肯定是 UTF-8。任何考虑“字符大小”的人都不再考虑与大小无关的抽象字符,这充其量是一条危险的道路。
  • 另外,它不是“一个超过超过256个值的单元”,而是一个other超过256个值的单元。这是因为有(有时仍然是)很多机器的字节少于 8 位,而不是更多。
  • @dan04:这并不比 Java 差,Java 的 char 甚至 Character 数据类型不能容纳字符。那是因为他们搞砸了抽象的概念字符,将高级字符与低级序列化方案混淆。然后雪上加霜,Java 还以所有可能的序列化表示中最丑陋的方式诅咒人们永远意识到错误或被错误困扰。真是一团糟!
  • @tchrist:确实。从 Java 5 开始,int 是新的 char。最近在一个 Scala 邮件列表上对此进行了广泛的讨论,其中有人抱怨 Scala 的 String 与 Java 的 String 相同,因此仍然将所有这些错误保留在专门设计为“更好的 Java”的语言。即使您不关心 Scala 和/或 Java,整篇文章都非常适合阅读。
【解决方案2】:

因为byte,按照其标准定义,是 8 位,可以表示 256 个值(0 到 255)。

【讨论】:

【解决方案3】:

字节≠八位字节

为什么一个字节的范围只有 0 到 255?

没有。

octet 有 8 位,因此允许 28 种可能性。 byte 定义不明确。不应将这两个术语等同起来,因为它们不能完全互换。此外,仅支持带符号字符的邪恶编程语言(ʏᴏᴜ ᴋɴᴏw ᴡʜᴏ ʏᴏᴜ ᴀʀᴇ﹗)只能表示值 -128 到 127,而不是 0 到 255。

大铁需要很长时间才能生锈。

大多数但不是所有现代机器都有 8 位字节,但这是一个相对较新的现象。当然并不总是这样。许多非常早期的计算机都有 4 位字节,而 6 位字节曾经很常见,甚至在最近也是如此。这两种类型的字节所包含的值都比 255 少。

那些 6 位字节可能非常方便,因为字长为 36 位,六个这样的字节完全适合这些 36 位字之一,没有任何抖动。这对于持有Fieldata 非常有用,非常流行的Sperry ᴜɴɪᴠᴀᴄ 计算机使用它。您只能将 4 个 ᴀsᴄɪɪ 字符放入 36 位单词中,而不是 6 个 Fieldata。当我还是一名本科生时,我们在计算中心有 1100 系列,但即使是现代的 2200 系列也是如此。

输入 ASCII

ᴀsᴄɪɪ——过去是并且是只有 7 位而不是 8 位代码——为打破那个世界铺平了道路。 ɪʙᴍ 360 的重要性不应被低估,无论它们是否包含 ᴀsᴄɪɪ,它都有 8 位字节。

尽管如此,许多机器长期支持ᴅᴇᴄ’s Radix‑50。这是一个 40 个字符的曲目,其中三个字符可以在两种不同的编码方案下有效地打包成一个 16 位的单词。我在大学期间使用了大量的 ᴅᴇᴄ ᴘᴅᴘ‑11s 和 Vaxen,而 Rad‑50 只是生活中的一个事实,一个必须适应的现实。

【讨论】:

  • 如果你能弄清楚如何处理剩下的 1 位,你可以将 5 个 ASCII 字符放入 36 位字中。
  • 虽然您的回答在技术上是正确的,但现在 6 位和 9 位字节更多地用于“字节≠八位字节”的学究,而不是实际编程。
  • “$LANGUAGE 标准没有精确定义 $TERM,但几乎所有的实现都使用 $DE_FACTO_STANDARD,除非你是为 $OBSCURE_PLATFORM 编写的,否则你可以放心地假设它。”
  • 就我个人而言,我认为语言不是由权威定义的——它是由“大众”定义的。如果大多数人说一个字节有 8 位,那么一个字节有 8 位。如果大多数人说黑客是绕过计算机安全系统的人,那就是黑客。同性恋并不意味着快乐,等等等等。无论“你应该按照我的规则手册说话”类型说什么,语言都会继续前进。
  • Imo,这个答案比 Skeets 更好,更简洁明了。
【解决方案4】:

一个字节有8位(8个1或0)01000111=71

每一位代表一个值, 1,2,4,8,16,32,64,128 但从右到左?

例子

128, 64, 32, 16, 8, 4, 2, 1,
0    1   0   0   0  1  1  1 =71
1    1   1   1   1  1  1  1 = max 255
0    0   0   0   0  0  0  0 = min 0

使用二进制 1 或 0 并且只有 8 位(1 字节)我们只能拥有

每个值 1 X 128, 1 X 64,1 X 32 等,总共 255 最小为 0

【讨论】:

    【解决方案5】:

    你错了!一个字节的范围从 0 到 63 或从 0 到 99!

    你相信God吗?大神在Holy Bible说。

    信息的基本单位是一个字节。每个字节包含未指定数量的信息,但它必须能够保存至少 64 个不同的值。也就是说,我们知道 0 到 63 之间的任何数字都可以包含在一个字节中。此外,每个字节最多包含 100 个不同的值。因此,在二进制计算机上,一个字节必须由六位组成;在十进制计算机上,我们每个字节有两个数字。* - 计算机编程艺术,第 1 卷,由 Donald Knuth 撰写。

    还有……

    * 自 1975 年左右以来,“字节”一词已经开始表示精确的八位二进制数字序列,能够表示数字 0 到 255。因此,现实世界的字节大于假设的 MIX 机器的字节数;事实上,MIX 的老式字节只比 nybbles 大一点。当我们谈到与 MIX 相关的字节时,我们将把自己限制在这个词的前一个含义上,回到字节还没有标准化的时代。 - 计算机编程艺术,第 1 卷,由 Donald Knuth 撰写。

    :-)

    【讨论】:

    • Knuth 的第一条语句仅适用于 MIX 机器字节 - MIX 机器可以在二进制计算机上实现,在这种情况下,字节包含 0 到 63,或者在十进制计算机上实现,在这种情况下byte 包含 0 到 99。他的脚注清楚地表明,术语“byte”通常不限于此,因此您的陈述是错误的。
    • @RedPain 我显然读过你的第二段引文,因为那是“他的脚注”。关键是您的第一个引号是脱离上下文的——它指的是 MIX 字节,而不是一般的字节。 Knuth 并没有傻到声称“一个字节的范围从 0 到 63 或从 0 到 99!”像你一样。事实是您的第一个报价出现在“MIX 的描述”下,这不是 OP 询问的内容,所以您的答案是错误的,就像我说的那样。
    • @Jim Balter:哦,我也读过我的第二个引文。关键是你有一种迟钝的幽默感。
    • @RedPain:我不相信上帝! :P
    【解决方案6】:

    一个字节只有 8 位。位是二进制数字。所以一个字节可以容纳 2(二进制)^8 个数字,范围从 0 到 2^8-1 = 255。

    这与问为什么一个 3 位十进制数可以表示 0 到 999 的值是一样的,答案是相同的 (10^3 - 1)。

    虽然最初的字节并不总是 8 位。它们代表“几个”位,也可以是 6、7 或 9 位。后来标准化了,由于计算机的二进制性质,使这些单位成为 2 的幂是有意义的。因此出现了半字节(4 位或半字节)和 8 位字节。

    [编辑] 这也是八进制和十六进制编号变得流行的原因。一个八进制数代表 3 位,一个十六进制数代表 4 位。所以一个十进制的十六进制数可以正好代表一个字节。从 0 到 0xFF 的数字比从 0 到 255 的数字更有意义。:)

    【讨论】:

      【解决方案7】:

      我会注意到,在 PDP-10 系列计算机上,一个字节是一个可变长度的结构,由一个“字节指针”定义,它定义了位数以及从存储开始的偏移量区域。然后有一组处理字节指针的机器指令,包括:

      • LDB - 加载字节
      • DPB - 存款字节
      • ILDB - 递增指针,然后加载字节
      • IDPB - 递增指针,然后是存入字节(希望我做对了 - 感觉不对)

      事实上,“字节”就是我们今天所说的位域。使用字节指针来表示一系列相同大小的字节中的下一个只是它的一种用途。

      使用的一些字符集是“sixbit”(仅大写,6 个字节到一个 36 位字),ASCII(大小写,五个字节到一个字,还有一点剩余) ,并且很少使用 EBCDIC(IBM 字符集,每个字使用四个八位字节,浪费了每个字四个位未使用)。

      【讨论】:

      • Common Lisp 语言具有称为 ldbdpb 的函数,Hyperspec 文档将两者的名称归于 PDP-10 汇编语言:lispworks.com/documentation/HyperSpec/Body/f_dpb.htm
      • 我认为 DSP 仍然经常有可变长度字节。甚至根本没有字节。 (如果您将“字节”解释为“最小的有效可单独寻址的内存块”。有些 DSP 可以以相同的性能寻址从单个位到整个字的任何内容,没有错位惩罚。可以说,没有诸如此类 CPU 上的“字节”之类的东西。)
      • @Jorg:按照这个定义,PDP-10 CPU 上没有字节这样的东西。只有 36 位字是可寻址的。字节指针包含位宽、与字开头的位偏移量以及字的地址。
      【解决方案8】:

      严格来说,不会。

      在大多数现代系统上,一个字节是 8 个二进制位,但在某些系统上并非总是如此(许多旧计算机使用 7 位来表示 ASCII 字符(也称为字节),而穿孔卡系统通常基于 6-位字符(又名字节),例如)。

      如果您说的是 8 位字节,它可以表示您希望的任何范围。但是,它只能表示 256 个不同的值,因此它通常用于表示 0..255(“无符号字节”)或 -128..+127(“有符号字节”)。 p>

      【讨论】:

      • 你能说出一台有 7 位字节的计算机吗?我不相信有,而且我认为这是一个令人困惑的说法。
      • 这取决于您是在“字符”的意义上定义“字节”(它最初是如何产生的:en.wikipedia.org/wiki/Byte),还是根据“CPU 寄存器的本机大小”来定义",这也许是你的想法。 ASCII 是一个非常普遍的标准,它基于 7 位“字节”(在前一种意义上)。许多计算机支持 ASCII,因此许多计算机使用/支持 7 位“字节”。在 ASCII 之前,穿孔卡片字符通常表示为 6 位字节。
      猜你喜欢
      • 2021-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      相关资源
      最近更新 更多