Compiler construction 我们可以有不同int位宽度的编译器吗?

Compiler construction 我们可以有不同int位宽度的编译器吗?,compiler-construction,int,bit,cpu-registers,Compiler Construction,Int,Bit,Cpu Registers,我们可以有不同位宽的整数大小的编译器吗?例如,在任何语言中是否可以使用以下内容: 5位不是8位的倍数 超过64位 或者与16位不同的东西 数据类型大小是否与寄存器大小有关 我记得在某个地方读到,int的大小不能大于寄存器大小,但我想有一个方便的参考。int这个词作为整数类型的名称对于C和与之相关的语言来说是相当特定的。例如,Pascal和Ada使用最常用的整数类型的名称Integer C要求除位字段以外的所有类型至少为8位,int至少为16位,尽管现在通常为32位,但您并没有询问C 对于一种语言

我们可以有不同位宽的整数大小的编译器吗?例如,在任何语言中是否可以使用以下内容:

5位不是8位的倍数 超过64位 或者与16位不同的东西 数据类型大小是否与寄存器大小有关

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

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

C要求除位字段以外的所有类型至少为8位,int至少为16位,尽管现在通常为32位,但您并没有询问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位整数类型_int128和无符号_int128。许多解释语言支持任意范围的整数,通常使用

数据类型大小是否与寄存器大小有关

通常,是的,只是因为使整数适合寄存器往往有助于高效代码。大于或小于CPU寄存器的整数可能效率较低

我记得在某个地方读到,int的大小不能大于寄存器的大小


那是不对的。在C中,int类型通常适合于寄存器,它的目的是具有执行环境的体系结构所建议的自然大小,但这不是一个要求。对于C以外的语言,答案至少与其他语言一样多。

1。不,但不是因为这个原因;2.对3.是的,现在几乎所有桌面操作系统/编译器都将int视为32位值,而不是16位。。我在某个地方读到过,int的大小不能大于寄存器的大小——错了,可能是某个草率的大学老师说的。@ParamagneticCroissant:为什么整数类型不能是5位?这在C语言中是非法的,它要求INT_MAX>=32767,但在其他一些语言中,整数类型不能为5位宽没有根本原因。如果你没有一个5位的CPU,它可能会非常低效。例如,Ada允许类型My_Integer的范围为-16+15;, 虽然它可能会存储在至少8位中。@KeithThompson是的,我忽略了这是语言不可知论。在我看来,int是一种与C相关联的类型,我所知道的任何具有int的语言(例如Java、C等)都没有5位int。这是一个很好的问题。OP的最后几句话暗示这个问题可能是关于C的。他不是很清楚,所以任何好的答案都必须同时针对C和非C编译器。基思在这方面的回答非常好。