【问题标题】:Can we have compilers with different int bit-widths?我们可以拥有不同 int 位宽的编译器吗?
【发布时间】:2014-07-28 18:47:12
【问题描述】:

我们可以有不同位宽的 int 大小的编译器吗?例如,以下是否可以用任何语言:

  1. 5位(不是8位的倍数)
  2. 超过 64 位
  3. 或不同于 16 位的东西

数据类型大小与寄存器大小有关系吗?

我记得在某处读到 int 的大小不能大于寄存器大小,但我想方便地参考一下。

【问题讨论】:

  • 1.不,但不是因为这个原因; 2. 是的; 3. 是的(现在几乎所有桌面操作系统/编译器都将int 视为 32 位值,而不是 16。)。 “我在某处读到它的 int 大小不能大于寄存器大小” - 错了,也许某个邋遢的大学老师说过那张公报。
  • @TheParamagneticCroissant:为什么整数类型不能是 5 位?它在 C 中是非法的,它需要 INT_MAX >= 32767,但在其他一些语言中,整数类型不能为 5 位宽没有根本原因。如果您碰巧没有 5 位 CPU,它可能会非常低效。 (例如,Ada 允许 type My_Integer is range -16 .. +15;,尽管它可能会以至少 8 位的形式存储。)
  • @KeithThompson 是的,我错过了这是与语言无关的。 (为我辩护,int 往往是与 C 相关的类型,并且我所知道的没有int 的语言 [例如 Java、C# 等] 具有 5 位 ints。)
  • 这是一个很好的问题。 OP的最后几句话暗示这个问题可能是关于C的。他不是很清楚,所以任何好的答案都必须针对C和非C编译器。基思在这方面的回答非常好。

标签: compiler-construction int bit cpu-registers


【解决方案1】:

int 这个词作为整数类型的名称是相当特定于 C 和与之相关的语言的。例如,Pascal 和 Ada 使用名称 Integer 作为最常用的整数类型。

C 要求所有类型(位字段除外)至少为 8 位,int 至少为 16 位(尽管现在很常见的是 32 位)——但您没有询问 C。

一种语言或一种语言的实现当然有可能具有任意大小的整数类型。

5 位对于 基本 整数类型来说不太可能是大小,但用户定义的整数类型(对于支持此类类型的语言)当然是可能的。例如,Ada 允许:

type Tiny_Integer is range -16 .. +15;
for Tiny_Integer'Size use 5; -- size is 5 bits

但是,在大多数机器上,这种类型的对象可能会存储在 8 位或更多位的内存中,除非它是打包数组或记录的组件。

我从未听说过具有 5 位寄存器的 CPU,但它肯定是可能的。一些旧 CPU 使用 4 位半字节;对于使用二进制编码的十进制的袖珍计算器来说,这是一个方便的尺寸,每个数字存储在 4 位中。针对这种 CPU 的语言可能具有 4 位整数类型。 (它也可能有更大的整数类型。)

大于 64 位的整数当然是可能的,并且大多数语言都允许(但不是必需)。 gcc C 编译器在某些目标系统上支持 128 位整数类型 __int128unsigned __int128。许多解释型语言支持任意范围的整数,通常使用GMP library 之类的东西。

数据类型大小和寄存器大小有关系吗?

通常,是的,只是因为使整数适合寄存器往往会产生高效的代码。比 CPU 寄存器大(或小)的整数可能效率较低。

我记得在某处读到 int 的大小不能大于寄存器大小,...

这是不正确的。在 C 中,类型 int 通常适合寄存器(它旨在具有“执行环境架构建议的自然大小”),但这不是必需的。对于 C 以外的语言,答案至少与语言一样多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多