字节是真实的吗?

Are bytes real?

我知道这个问题听起来很愚蠢,但让我解释一下。所以...

大家都知道字节是8位。简单吧?但是具体在哪里指定呢?我的意思是,从物理上讲,您实际上并没有使用字节,而是位。例如驱动器。据我了解,它只是一个非常长的 1 和 0 字符串,而不是字节。当然,有扇区,但据我所知,有软件级别的编程(我认为至少在 SSD 中)。还有 RAM,它又是一长串 1 和 0。另一个例子是 CPU。它不会一次处理 8 位,而只会处理一个。

那么具体是在哪里规定的呢?或者它只是一般规则,每个人都遵循?如果是这样,我是否可以制作一个系统(操作系统或什至更低级别的系统)来使用,比方说,一个字节中的 9 位?或者我不必?另外 - 为什么你不能使用少于一个字节的内存?或者也许你可以?例如:两个应用程序是否可以使用相同的字节(例如,第一个使用 4 位,第二个使用其他 4 位)?最后但并非最不重要的一点——计算机驱动器真的使用字节吗?或者,例如,第 1-8 位属于某个东西,在它们旁边有一些 3 个随机位,而第 12-20 位属于不同的东西?

我知道有很多问题,知道这些问题的答案不会改变任何事情,但我只是想知道。

编辑:好的,我可能表达得不够清楚。我知道字节只是一个概念(好吧,即使是位也只是我们实现的概念)。我不是在问为什么字节中有 8 位以及为什么字节作为一个术语存在。我要问的是计算机中的什么地方是字节定义的,或者它是否被定义了。如果字节确实在某处定义,在什么级别(硬件级别、OS 级别、编程语言级别或仅在应用程序级别)?我还问计算机是否甚至关心字节(在我们已经实现的那个概念中),如果它们经常使用字节(比如在两个字节之间,是否可以有 3 个随机位?)。

是的,它们是真实的,因为它们有定义和标准化 use/understanding。 byte 的维基百科文章说:

The modern de-facto standard of eight bits, as documented in ISO/IEC 2382-1:1993, is a convenient power of two permitting the values 0 through 255 for one byte (2 in power of 8 = 256, where zero signifies a number as well).[7] The international standard IEC 80000-13 codified this common meaning. Many types of applications use information representable in eight or fewer bits and processor designers optimize for this common usage. The popularity of major commercial computing architectures has aided in the ubiquitous acceptance of the eight-bit size.[8] Modern architectures typically use 32- or 64-bit words, built of four or eight bytes

整篇文章可能值得一读。 50 多年前没有人停下来,用拳头敲桌子说“一个字节不应该是 8 位”,但随着时间的推移,它变成了这样,流行的微处理器能够一次对 8 位执行操作。随后的处理器架构对其倍数执行操作。虽然我确信英特尔可以使他们的下一个芯片具有 100 位的能力,但我认为我们将遇到的下一个位数革命将是 128

Everyone knows that byte is 8 bits?

这些天,是的

But where exactly is it specified?

ISO 代码见上文

I mean, phisically you don't really use bytes, but bits.

从物理上讲,我们也不使用比特,而是使用铝锈涂层 sheet 上的可检测磁场强度阈值,或电荷存储量

As I understand, it's just a reaaaaly long string of ones and zeros and NOT bytes.

没错,对于计算机来说,一切都是 0 和 1 的很长的流。定义任何其他内容时重要的是在何处停止计算这组 0 或 1,并开始计算下一组,以及您要做什么呼叫群组。一个字节是一组 8 位。为了方便,我们将事物分组。 24罐啤酒带回家,比一个箱子装24罐要方便多了

Sure, there are sectors, but, as far as I know, there are programmed at software level (at least in SSDs, I think)

扇区和字节是类似的,因为它们代表一些东西的分组,但它们不一定像位和字节那样直接相关,因为扇区是字节之上的分组级别。随着时间的推移,扇区作为轨道段的含义(对盘片编号和距盘片中心的距离的引用)已经发生变化,因为进步的步伐已经消除了位置寻址和后来甚至旋转存储。在计算中,您通常会发现有一个难以使用的基本级别,因此有人在其之上构建了一个抽象级别,这成为新的“难以使用”,因此它被一次又一次地抽象。

Also RAM, which is again - a long stream of ones and zeros

是的,因此很难使用,所以它被抽象了,又被抽象了。您的程序并不关心提高存储芯片某些电容区域的电荷水平,它使用它可以访问的抽象,并且该吸引力会降低下一个级别,依此类推,直到魔术发生在底部层次结构。在这个向下的旅程中,你在哪里停下来主要是一个定义和任意选择的问题。我通常不会将我的 ram 芯片视为充满电子或亚原子量子的冰块托盘,但我可以这么想。当它对解决问题不再有用时,我们通常会停止 问题

Another example is CPU. It doesn't process 8 bits at a time, but only one.

这在很大程度上取决于你对“一次”的定义——这个问题的大部分是关于各种事物的定义。如果我们任意决定“一次”是多个皮秒的单位块,它需要 cpu 来完成一个周期那么是的,CPU 可以一次对多个信息位进行操作 -拥有多个位 cpu 的整个想法可以将两个 32 位数字加在一起并且不会忘记位。如果你想如此精确地划分时间,以至于我们可以确定有足够的电荷流向这里而不是那里,那么你可以说出 cpu 在这一微微秒(或更小)秒内正在运行的位,但是如此细粒度是没有用的,因为在 cpu 等待的时间片结束之前什么都不会发生。 可以这么说,当我们划分时间刚好足以从头到尾观察一个 cpu 周期时,我们可以说 cpu 正在不止一位上运行。

如果你每秒写一个字母,而我每 3 秒闭上眼睛 2 次,我会看到你“同时”写了整整 3 个字母的单词 - 你写了“the cat”坐在垫子上”,对观察者来说,你同时生成了每个词。 CPUs 运行 出于类似原因的循环,它们对电荷的流动和积累进行操作,您必须等待一定的时间才能积累电荷,以便触发下一组open/close 的逻辑门并将电荷引导到别处。更快的 CPUs 基本上是更敏感的电路;电荷的流动速率相对恒定,这是您准备等待输入从这里流到那里的时间,以便那个桶充满足够的电荷,随着 MHz 的增加而缩短。一旦积累了足够的电荷,碰撞!发生某事,“同时”处理多件事

So where exactly is it specified? Or is it just general rule, which everyone follows?

这是一般规则,然后指定它以确保它继续作为一般规则

If so, could I make system (either operating system or even something at lower level) that would use, let's say, 9 bits in a byte? Or I wouldn't have to?

你可以,但你基本上必须编写现有处理器架构的改编(抽象),并且你将使用九个 8 位字节来实现你对八个 9 位字节的表示。您正在抽象之上创建抽象,基本构建块的边界不对齐。你需要做很多工作才能完成系统,但你不会费心。

在现实世界中,如果冰块托盘一次可以制作 8 个冰块,但您认为一个人放入冰箱的最佳数量是 9 个,那么您会购买 9 个托盘,将它们冷冻并制作 72 个冰块,然后将它们分成 8 袋,然后以这种方式出售。如果有人带着 9 立方体的水(它融化了)出现,你必须把它分成 2 个托盘,冷冻,然后还给它。你的行业提供的 8 个插槽托盘和你处理 9 个插槽的愿望之间的这种不断适应cubes 是自适应抽象

如果你这样做了,也许就叫它晚安吧? :)

Also - why can't you use less than a byte of memory? Or maybe you can?

你可以,你只需要在现有抽象是 8 位的限制下工作。如果你有 8 个布尔值要存储,你可以编写代码,这样你就可以打开和关闭字节的位,所以即使你被 8 立方体冰格卡住了,你也可以有选择地填充和清空每个立方体。如果您的程序只需要 7 个布尔值,您可能不得不接受其他位的浪费。或者您可以将它与常规 32 位 int 结合使用以跟踪 33 位整数值。不过,需要做很多工作,编写一个改编版本,知道在您尝试将 1 加到 4,294,967,295 时继续进行到第 33 位,而不是仅仅抛出溢出错误。内存足够多,你会浪费这个位,并使用 64 位整数浪费另外 31 位来保存你的 4,294,967,296 值。

一般来说,现在资源非常丰富,我们不在乎浪费一点。当然,情况并非总是如此:以信用卡终端通过慢速线路发送数据为例。每一位都对速度至关重要,因此与银行进行信息交换的古老协议很可能会使用同一字节的不同位来编码多种事物

For example: is it possible for two applications to use the same byte (e.g. first one uses 4 bits and second one uses other 4)?

不,因为如今的硬件和 OS 内存管理将程序分开以确保安全性和稳定性。但在过去,一个程序可以写入另一个程序的内存(这就是我们在游戏中作弊的方式,看到生命计数器下降,只是覆盖一个新值),所以在那些日子里,如果两个程序可以运行,并且一个只会写入 4 个高位和另一个 4 个低位然后是的,他们可以共享一个字节。虽然访问可能是整个字节,因此每个程序都必须读取整个字节,只更改它自己的位,然后将整个结果写回

And last, but not least - does computer drives really use bytes? Or is it that, for example, bits 1-8 belong to something, next to them there are some 3 random bits and bits 12-20 belong to something different?

可能不会,但您永远不会知道,因为您没有深入了解抽象级别,无法看到磁盘作为位序列布局,也不知道字节边界或扇区边界在哪里,以及这个逻辑扇区是否跟在那个逻辑扇区之后,或者磁盘表面的缺陷是否意味着这些扇区不会彼此相连。不过,您通常并不关心,因为您将驱动器视为连续的字节数组(等),并让其控制器担心这些位在哪里