我们可以使用不同的int位宽编译器吗?

时间:2014-07-28 18:47:13

标签: compiler-construction int bit cpu-registers

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

  1. 5位(不是8位的倍数)
  2. 超过64位
  3. 或者与16位不同的东西
  4. 数据类型大小是否与寄存器大小有关。

    我记得在某处读过一个int的大小不能大于寄存器大小,但是我希望有一个方便的参考。

1 个答案:

答案 0 :(得分:2)

单词int作为整数类型的名称,对C和与之相关的语言非常具体。例如,Pascal和Ada使用名称Integer作为最常用的整数类型。

C要求所有类型(除了位字段)至少为8位,int至少为16位(尽管现在非常常见32位) - 但你没有& #39; t问C。

对于语言或语言的实现来说,当然可以使用任意大小的整数类型。

对于基本整数类型,

5位是不太可能的大小,但用户定义的整数类型(对于支持此类型的语言)肯定是可能的。例如,阿达允许:

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以外的语言,答案至少与语言一样多。

相关问题