为什么存在字节?为什么不能只使用位?

24

在大多数系统中,一个字节由8个比特组成。

字节通常代表程序员可能使用的最小数据类型。根据编程语言,数据类型可能被称为charbyte

有些数据类型(布尔值、小整数等)可以使用比一个字节更少的位来存储。然而,在我所知道的任何编程语言中,都不支持使用少于一个字节的存储方式(原生支持)。

为什么存在使用8个比特来存储数据的最小要求?为什么我们需要字节?为什么计算机不只使用比特的增量(1个或多个比特),而是使用字节的增量(8个比特的倍数)?

以防有人问:我不担心这个问题。我没有任何特定的需求。我只是好奇。


2
有些系统使用的字节大小不是8位。 - M.M
2
是的,但你可能正在读取32位或64位,所以谁在乎呢? - user4581301
1
既然已经进入21世纪,@JackRyan,是时候让您熟悉公制了。=) - paddy
5
这似乎与主题无关。 - Lightness Races in Orbit
1
@JackRyan:世界上大多数地区都很高兴他们没有英寸或英尺,而是使用一种非常奇怪的测量系统,称为“公制系统”。如果我没记错的话,这也是美国官方标准,但它太奇怪了,以至于他们拒绝在日常使用中使用它。想象一下:单位基于因子10-无处不在-而不是完全不规则的因子。多么奇怪啊。 - too honest for this site
显示剩余9条评论
7个回答

11

因为在硬件层面,内存自然地被组织成可寻址的块。小块意味着您可以拥有像4位数字这样精细的东西;大块则允许更高效的操作(通常CPU以“块”或块的倍数移动数据)。特别是更大的可寻址块使得地址空间更大。如果我的块大小为1位,那么地址范围为1-500只覆盖了500位,而500个8位的块则涵盖了4000位。

注意 - 并非总是8位。我曾经使用过一台以6位为单位进行计算的机器。(好老的八进制)


7
纸带(大约20世纪50年代)宽度为5或6孔(位),也许还有其他宽度。新型的打孔卡片则是12行80列。
1960年代: B-5000 - 48位“字”,每个字符6位 CDC-6600 - 60位字,每个字符6位 IBM 7090 - 36位字,每个字符6位 还有12位机器等等。
1970年代至1980年代,“微型计算机”开始出现: Intel 4004 - 4位块 8008、8086、Z80、6502等 - 8位块 68000 - 16位字,但仍为8位字节 486 - 32位字,但仍为8位字节 如今 - 64位字,但仍为8位字节 未来 - 128位等等,但仍为8位字节
明白了吗?美国人认为字符只需要存储6位。 然后我们发现世界上不仅仅有英语。 所以我们尝试使用7位ASCII码和8位EBCDIC码。
最终,我们决定8位就足够存储所有需要的字符了。(“我们”指的不是中国人。)
IBM-360成为60年代到70年代最具影响力的机器;它基于8位字节。(它有32位字,但这已经不像8位字节那么重要了。)
使用8位字节似乎是一种浪费,因为你只需要7位就能存储所有你需要的字符。
IBM在20世纪中叶“拥有”计算机市场的70%硬件和软件销售。360成为他们主要的机器,8位字节是其他竞争者复制的东西。
最终,我们意识到其他语言存在并创造了Unicode/utf8及其变体。但那是另一个故事了。

2

在深夜写点什么的好方法!

你的观点是完全正确的,但历史总是那个疯狂的闯入者,在你出生之前就已经破坏了你的计划。

为了解释起见,让我们想象一个名为 Bitel(TM) Inside 或类似名称的虚构机器架构。 Bitel 规格要求中央处理单元(CPU,即微处理器)以一位单位访问内存。 现在,假设一个给定的 Bitel 操作机器具有一个存储32亿位(我们虚构的4GB RAM单元的等效物)的存储器单元。

现在,让我们看看为什么 Bitel,Inc. 破产:

  • 任何给定程序的二进制代码都将是巨大的(编译器必须操纵每个单个位!)
  • 32位地址将被(更加)限制为仅容纳 512MB内存。 64位系统目前还算安全...
  • 内存访问将成为死结。 当CPU获得它需要处理单个 ADD 指令的所有48位时,软盘已经旋转了太久,然后你知道接下来会发生什么...
  • 真的有人需要优化单个吗?(参见先前的破产理由)。
  • 如果您需要处理单个位,请学习使用位运算符
  • 程序员们会变得疯狂,因为咖啡和RAM都变得太贵了。 目前,这是末日的完美代名词。
  • C标准是神圣的,它规定可寻址的最小单元(即 char )至少应为8位宽。
  • 8 2 的完美幂。( 1 是另一个完美幂,但是无所谓...)

我认为C标准反映了硬件的现状和发展方向,而不是相反。当“int”需要从16位整数提升到32位时,C经历了一场混乱。在这个过渡期间,编写非可移植代码变得太容易了。 - Rick James

1
在我看来,这是一个寻址的问题。要访问单个数据位,你需要比访问单个字节多八倍的地址(每个地址添加3位)。在程序中,字节通常是保存数字的最小实用单位(只有256种可能的值)。

谢谢你的回答。那么我想知道:拥有8倍的地址会引起问题吗? - user636044
@TomDworzanski 我认为8位是最合适的大小。因为4位甚至不能容纳英文字母。它完全没有用处。而16位对于一些数据操作来说太大了,比如文本数据。 - cshu
1
@TomDworzanski,我有点解释不清楚,但是需要8倍的地址,需要3个额外的数据位来确定选择哪个位。总体而言,这将非常低效,特别是考虑到这些位本身几乎没有用处。想象一下规划一个城市,每栋建筑都有八个房间,每个房间都有一个独特的地址。如果您想要将整个建筑物标识出来,则每栋建筑物有七个不必要的地址。这是类似的情况。 - sneelhorses
可能也是用于旧的大型机的相同论点,这些机器只能寻址整个字(32、40、60等位)。 - Rick James
@cshu - 长期以来(1950年代-1960年代),计算机很高兴将英语存储在6位元件中(仅大写)。 - Rick James

1
一些CPU使用单词来寻址内存,而不是字节。这是它们的自然数据类型,因此为16或32位。如果英特尔CPU这样做,它将是64位。
8位字节是传统的,因为最早流行的家用计算机使用8位。256个值足以完成许多有用的事情,而16(4位)则不够。
还有,一旦一件事情持续了足够长的时间,就变得非常难以改变。这也是为什么您的硬盘或固态硬盘可能仍然假装使用512字节块的原因。即使磁盘硬件不使用512字节块,操作系统也不使用。(高级格式驱动器具有软件开关可禁用512字节仿真,但通常只有带RAID控制器的服务器才会关闭它。)
此外,英特尔/AMD CPU拥有大量额外的硅芯片执行大量额外的解码工作,因此8位与64位寻址的轻微差异不会增加任何明显的开销。 CPU的内存控制器肯定不是使用8位。它以长流形式将数据拉入缓存,最小大小是缓存行,通常为64字节,即512位。通常,RAM硬件启动速度较慢,但流速较快,因此CPU将千字节读入L3缓存,就像硬盘将整个轨道读入其缓存一样,因为驱动器头已经在那里了,所以为什么不呢?

0
为什么要用字节?
8位有什么特别之处,以至于它值得拥有自己的名称? 计算机处理所有数据都是以比特为单位,但它们更喜欢以字节大小的组合方式来处理比特。或者换句话说:一个字节是计算机一次“咬”多少数据的量。
在大多数现代计算机中,字节也是最小可寻址的内存单元。具有字节寻址内存的计算机无法存储小于一个字节的单个数据。
一个字节包含什么? 根据上下文,一个字节表示不同类型的信息。它可能表示数字、字母或程序指令。它甚至可能表示音频录制的一部分或图像中的一个像素。 来源

0

首先,C和C++确实原生支持位域

#include <iostream>
struct S {
    // will usually occupy 2 bytes:
    // 3 bits: value of b1
    // 2 bits: unused
    // 6 bits: value of b2
    // 2 bits: value of b3
    // 3 bits: unused
    unsigned char b1 : 3, : 2, b2 : 6, b3 : 2;
};
int main()
{
    std::cout << sizeof(S) << '\n'; // usually prints 2
}

也许答案在于性能和内存对齐,以及(我认为部分原因是因为在C语言中byte被称为char)字节是机器字中可以容纳7位ASCII的最小部分。文本操作很常见,因此为编程语言提供纯文本的特殊类型具有其优势。

当“单词边界”很重要时,C编译器允许在结构成员之间填充。想象一个具有charint的结构,在生成适用于16位字长且没有越界访问的机器的代码时进行填充。例如:原始Macintosh使用的Motorola 68000。 - Rick James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接