请教大家一个计算机组成原理的问题

2023-04-17 15:48:27 +08:00
 OrdinaryMan

当初大学计组这里就没想明白,最近重学机组还是在这里碰壁,故来 v 站请教各位 IT 同志: 既然现代计算机都是按字节编制,也就是每个地址对应一个字节大小的存储单元,也就是说按字节编制存储字长就是 8 位,那为什么存储字长还可以是 32 位,64 位? 我知道这句话肯定有问题,具体是哪里除了问题呢?

8041 次点击
所在节点    程序员
76 条回复
raymanr
2023-04-17 16:04:24 +08:00
在计算机中,存储单元的大小是按位( bit )衡量的,换句话说,一个存储单元可以存储的二进制位数决定了它的大小。虽然现代计算机的存储单元是按字节( byte )衡量的,即每个存储单元对应 8 位二进制数,但是计算机的指令集可以使用不同的位数来操作数据和地址。

因此,存储字长( word size )是指 CPU 处理数据和地址时使用的二进制位数。虽然常见的存储字长包括 8 位、16 位、32 位和 64 位等,但是它不一定与存储单元的大小相同。事实上,存储字长需要考虑多个方面的因素,例如 CPU 架构、操作系统、应用程序等。存储字长的大小可以影响计算机的性能和可用内存空间等。

因此,尽管现代计算机的存储单元是按字节编制的,但存储字长可以是不同的位数,这取决于具体的计算机体系结构。

FROM CHATGPT.
magicfield
2023-04-17 16:23:33 +08:00
位就是 01 一个存储单位,字节就 8 位的存储长度
ASCII 码就是典型一个字节存储的
GBK 是两个字节存储的,你也可以认为是 16 位存储长度
UTF-8 是 1~4 字节就可以是 8~32 位

不用特别在意单位,反正都是能换算的

至于电脑的 32 位或 64 位指的是 CPU 一次能处理的位数
elmagnificogg
2023-04-17 16:24:59 +08:00
最初确实是 8 位,但是这样的 cpu 效率太低了,一次才能处理一字节所对应的命令或者数据,完全不够用

为了提升效率就有了 16 位、32 位到现在好不容易普及的 64 位

现在应该是没有什么字节编制这么一说,基本上大部分存储设备目前都是有对齐要求的,对齐的大部分也都远超 8 位,很多 32 位对齐,128 位对齐,4k 对齐,这个和实际的存储芯片设计的存储结构有关系和缓存加速读取也有关系
NaiveSimpleYoung
2023-04-17 16:27:21 +08:00
@raymanr 建议把 「 FROM CHAT GPT 」放在开头
hxm0070
2023-04-17 16:28:35 +08:00
CPU 是 8 位的物理意义上指的是地址线引脚有 8 个,但是最早期的时候什么 4 位的 5 位的 7 位的乱七八糟的都有。
后来 Byte 定为 8 其实有一个过程,4/5/6/7 都有人用过,最终要包含所有常用的英文字符一共有 128 个(现在的 ASCII ),正好 7 位,然后可能还有别的一些因素(存储芯片成本降低了一些可以浪费 1 位、8 又是 2 的次幂方便计算机处理、与早期较流行的 6bit 一定程度可以兼容等等等等大家都这么猜测),1964 年的 IBM System/360 就用了 8 位,IBM 兼容机就这么沿用下来了。
后来位数成倍增加最主要的原因是 CPU 对内存的直接寻址空间不够了(因为地址线引脚就这么多),比如前几年升级 64 位的时候都在说的 32 位电脑理论上的 RAM 最大 4G 左右就是这个寻址空间了。。
nyxsonsleep
2023-04-17 16:30:33 +08:00
拿单片机的数据引脚、gpio 来类比来说就是有的只有 8pin ,有的 16pin 。但在正确设计的情况下,并不影响读取、交换数据。
brader
2023-04-17 16:44:11 +08:00
说下我的认知(非专业,仅供参考):
当下主流的 cpu 架构来说,我认为 cpu 位宽和外存储器的存储字长没有很强的强关联关系。
现在的计算机结构,cpu 更多的是和 CPU 寄存器,总线,内存 这些打交道,cpu 的位宽会决定这些配件的位宽,外存储器的数据是加载到内存后,才给 cpu 使用的。
009694
2023-04-17 16:47:42 +08:00
@raymanr gpt3.5 的回答就不要放上来了,要放也得放 4 的 3.5 的免费接口免费站已经满天飞了 不至于劳烦各位代问
tusj
2023-04-17 16:50:00 +08:00
大概就是米饭一粒一粒的吃太慢了,就一勺一地吃呗
DeWjjj
2023-04-17 16:50:16 +08:00
首先我们知道 CPU 有一个快速缓存对吧,那个的大小就是严格对齐 64 位 32 位的。
只是在计算机最初,他们是 64 和 32 而已,现在你会发现的就是即是不是 x86 的一样可以通用,是因为现在快速缓存区已经远超当年设定的值了。
OrdinaryMan
2023-04-17 16:53:57 +08:00
@brader 我的问题里存储单元的存储器就是指的内存
OrdinaryMan
2023-04-17 16:56:37 +08:00
@hxm0070 意思是现代计算机虽然是按字节编址,此时实际上存储单元大小也可能是字节整数倍。所以多个地址可能指代的是一个存储单元吗
YCCD
2023-04-17 16:57:05 +08:00
每个地址对应一个存储单元,一个存储单元 8bit ( 8 位)
4 个存储单元就 32bit ( 32 位),就一个 int 大小
8 个存储单元就 64bit ( 64 位),一个 double 的大小
OrdinaryMan
2023-04-17 16:59:02 +08:00
@YCCD 意思是现代计算机虽然是按字节编址,但是实际上存储单元大小是字节整数倍。所以多个地址可能指代的是一个存储单元吗
YCCD
2023-04-17 17:01:04 +08:00
0x8000 到 0x8004 代表四个存储单元,代表一个 int ( 32 位)
@OrdinaryMan
kaedeair
2023-04-17 17:06:17 +08:00
CPU 寻址位宽和数据位宽不是一个概念
Pil0tXia
2023-04-17 17:29:47 +08:00
看来楼上的还了不少给学校老师了😎
#16 正解。CPU 的那个“位”是内存地址的位数,比如 32 位的 CPU 只能管理 4GB 的内存; int 、double 的“位”是寻址找到内存地址后对象的大小。
feather12315
2023-04-17 17:32:02 +08:00
16 楼正解,属于叫 cacheline
raymanr
2023-04-17 17:32:44 +08:00
@OrdinaryMan 简单的模型就是 CPU 有一个寄存器, 存放了 32 位或者 64 位的偏移量去定位内存的位置, 内存里面的东西是 8 位, 但是这个 8 位数据所在的地址是 32/64 位的.
raymanr
2023-04-17 17:35:55 +08:00
推荐楼主看一下 <操作系统导论> 这本书, 里面对于 CPU 和内存, 磁盘机制有相应描述. 本来我觉得我 1 楼复制粘贴的回答已经说明白了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/933184

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX