为什么我们使用显式数据类型? (从低角度来看)

时间:2018-12-16 18:57:39

标签: c types x86 language-design low-level

当我们看一些基本数据类型(例如char和int)时,我们知道char只是一个无符号的字节(取决于语言),int只是一个有符号的双字,bool只是一个只能是1或0,等等。我的问题是,为什么我们要在编译语言中使用这些类型,而不是仅仅声明类型为byte,dword等的变量,因为应用于上述类型的操作几乎都是同样,一旦您区分有符号和无符号数据以及浮点数据?

为扩展问题的上下文,使用C语言,if和while语句可以将布尔值作为输入,通常将其存储为char,这消除了对显式布尔类型的需要。

实际上,这两段代码在二进制级别应该是等效的:

int main()
{
    int x = 5;
    char y = 'c';
    printf("%d %c\n", x - 8, y + 1);
    return 0;
}

//outputs: -3 d

-

signed dword main()
{
    signed dword x = 5;
    byte y = 'c';
    printf("%d %c\n", x - 8, y + 1);
    return 0;
}

//outputs: -3 d

3 个答案:

答案 0 :(得分:4)

  

我的问题是,为什么我们要在编译语言中使用这些类型

使代码与目标无关。某些平台仅具有有效的16位整数,并且强制变量始终为32位将在为此类平台编译时无缘无故使您的代码变慢。或者,也许您有一个包含36位整数的目标,而严格的32位类型将需要额外的指令来实现。

您的问题听起来非常以x86为中心。 x86并不是唯一的体系结构,对于大多数语言来说,语言设计人员也不会想到。

甚至x86时代设计的较新语言在台式机和服务器上广泛使用,其设计也可移植到其他ISA,例如8位AVR,其中32位int将占用4个寄存器,而。2表示16位int

答案 1 :(得分:3)

一种编程语言定义了一个“抽象”数据模型,计算机设计者可以自由地实现他的方式。例如,没有任何强制性要求将布尔值存储在字节中,它可以与其他位一起“打包”成一个位。而且,如果您仔细阅读C标准,您会发现char没有定义大小。

[有趣的是,我记得很久以前,FORTRAN变量(包括整数,浮点数和布尔值)存储在IBM机器上的72位上。]

语言设计师应该对机器体系结构施加很少的限制,以留出机会进行漂亮的设计。实际上,语言没有“底层”,它们隐式地描述了不与特定硬件绑定的虚拟机(可以使用齿轮和绳索来实现)。

据我所知,只有ADA语言可以详细说明算术的所有特征,而不能强制每个单词使用位数。


忽略布尔类型是C语言中最可悲的设计决定之一。我迟到了C99才集成它:-(

另一个可悲的决定是停止将int类型视为自然适合机器字的类型(并且在当前PC中应该变为64位)。

答案 2 :(得分:2)

高级语言的目的是提供与机器详细信息的隔离。因此,我们说的是“整数”,而不是特定数量的内存字节。然后,该实现将高层类型映射到最适合目标硬件的位置。

并且与不同的4字节类型相关联的语义也不同:对于整数,对于某些类的程序,有符号与无符号很重要。

我理解这是一个C问题,关于高级C是否存在争议。但它至少打算可跨机器体系结构移植。

并且,在您的示例中,您假设'int'是32位。语言中没有什么可以说是真的。这并不总是正确的,在原始的PDP-11实现中肯定不是正确的。例如,如今,在64位计算机上将“ int”设为64位可能是合适的。

请注意,语言具有诸如“整数”之类的类型并非一成不变。BLISS是与C概念级别相同的语言,其机器字是唯一的内置数据类型。