3

为什么可以在内存中存储一​​个字节(8位)而不是位(1位)的最小值?甚至布尔值也存储为字节。我们会不会像 CPU 上的寄存器一样将最小的数字提升到 32 位或 64 位?

编辑:澄清尽可能多的答案似乎对探索的性质感到困惑。这个问题是关于为什么一个字节不是 7 位、1 位、32 位等(不是为什么低位原语必须在最小时适合硬件的字节)。8 位字节是否只是历史性的,例如某些硬件具有 10 位字节。或者是否有数学原因 8 位是理想的而不是 10 位的一般处理?

4

4 回答 4

5

硬件用于读取块中的数据(字节、后面的字和双字)。与访问单个位相比,这提供了更高的效率,并且还提供了更大的寻址范围。因此,大多数数据至少与字节边界对齐。存在使用位序列而不是字节操作的编码,但它们非常罕见。

如今,无论如何,数据通常都与 dword(32 位)边界对齐。此外,某些硬件(例如 ARM)无法访问未对齐的多字节变量,即 16 位字不能“跨越”双字边界 - 将引发异常。

于 2011-01-05T18:14:09.283 回答
3

因为计算机在字节级别寻址内存,所以任何小于字节的东西都是不可寻址的。

于 2011-01-05T18:11:59.657 回答
1

处理器访问的底层方法仅限于最小可用寄存器的大小。在大多数架构上,该大小为 8 位。您可以使用其中的较小部分;例如,C 在结构中具有位域特性,允许组合只需要特定位长度的字段。访问仍然需要读取整个字节。

一些较旧的异国架构实际上确实有不同的“字长”。在这些机器中,10 位可能是常见的大小。

最后,处理器几乎总是向后兼容。例如,英特尔从 386 开始就一直保持完整的指令兼容性。如果您采用为 386 编译的程序,它仍将在 i7 处理器上运行。更改字长会破坏兼容性。因此,尽管可能,但没有制造商会这样做。

于 2011-01-05T18:14:50.470 回答
0

假设我们的母语由 2 个字符组成,例如 a , b 来区分两个字符,我们至少需要 1 位,例如 0 代表 char a 和 1 代表 char b

因此,如果我们计算字符数和特殊字符和符号,则有 128 个字符,为了区分一个字符,您需要 log2(128) = 7 位和第 8 位进行传输

于 2021-02-15T15:03:54.353 回答