【问题标题】:Calculating required bytes to store an integer计算存储整数所需的字节数
【发布时间】:2021-10-17 11:40:40
【问题描述】:

鉴于我们的 RAM 单元有 6 个地址位和 32 位架构,存储一个整数值需要多少字节?答案说 4 个字节,但我不明白为什么会这样。

有人可以帮我理解他们是如何得到 4 的吗?

【问题讨论】:

  • 在 32 位架构上,您通常会选择 int 的宽度为 32 位,与寄存器的宽度相同,即 4 字节,不管总字节数是多少有RAM(因此您有多少地址位)。你不能“计算”这个,这是一个任意的选择。您还可以使用 1 字节整数值,例如 C int8_t,用于为不需要大值范围的事物节省空间。
  • 本质上这是一个非常糟糕的问题。 “32 位架构”不是一个精确的术语。 如果您假设 32 位是数据路径/寄存器宽度并且假设整数由该宽度表示,并且还假设 byte 有 8 位,然后你得到 32/8=4 字节。例如。许多 8086 时代的系统实现了 32 位和 64 位整数,即使它们是 16 位架构。更不用说 8 位(正如 Peter 提到的)和 BCD 整数。
  • 当然,在 64 位 ISA 上,大多数 C 实现仍然选择 32 位 int,因为它已经足够宽了,而带有 32 位 int 的 C 已经广泛使用了足够长的时间存在这么多代码,可以更好地使用它(或使用它)。因此,任何语言的默认整数数据类型都必须与寄存器具有相同的宽度,这不是一个规则。例如,在 x86-64 机器代码中,默认操作数大小为 32 位。因此,除非您获得有关该整数的隐含寄存器宽度有多宽的更多信息,否则这是一个非常糟糕的分配问题。

标签: assembly memory cpu-architecture ram


【解决方案1】:

地址位数并没有真正考虑到存储整数的基础。 (稍后会详细介绍。)

你需要知道:

  1. 一个整数占用多少位
  2. 每个内存位置/地址存储多少位

鉴于这些,您可以计算保存该大小的 int 所需的内存位置数,即

每个整数 32 位 / 每个内存位置 8 位 = 每个整数 4 个内存位置。

如果机器每个内存地址存储 8 位,那么它就是我们所说的byte addressable,并且它必然需要多个字节来存储大于 8 位的任何内容。使用多个字节也意味着使用多个地址:最常见的约定是整个多字节对象由它使用的(数字上)最低地址引用。因为多字节实体需要多个地址,所以用于其他目的的下一个可用地址需要超出多字节项目的最后一个字节。

有些机器是字可寻址的,这意味着单个内存地址存储超过 8 位,有时是 16、18 或更大。

拥有可以存储指针的整数大小很有用,但在您的情况下,指针只需要 6 位,而在大多数 32 位机器上,指针需要 32 位。

【讨论】:

  • @PeterCordes,是的;删除了对 C 数据类型的引用..
猜你喜欢
  • 2018-02-10
  • 2011-11-01
  • 2015-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-21
  • 1970-01-01
  • 2012-12-29
相关资源
最近更新 更多