3

当我们看一些基本的数据类型,例如 char 和 int 时,我们知道 char 只是一个无符号字节(取决于语言),int 只是一个有符号 dword,bool 只是一个只能是1 或 0,等等你区分有符号和无符号数据,以及浮点数据?

为了扩展问题的上下文,在 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
4

3 回答 3

4

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

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

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

甚至在 x86 时代在台式机和服务器上广泛使用的最新语言被设计为可移植到其他 ISA,例如 8 位 AVR,其中 32 位int需要 4 个寄存器,而 16 位需要 2 个寄存器int

于 2018-12-16T19:04:09.077 回答
3

编程语言定义了一个“抽象”数据模型,计算机设计者可以自由地按照自己的方式实现。例如,没有什么要求将布尔值存储在一个字节中,它可以与其他位一起“打包”为一个位。如果您仔细阅读 C 标准,您会注意到 char 没有定义的大小。

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

语言设计者应该对机器架构施加很少的限制,为好的设计留下机会。事实上,语言没有“低级”,它们隐含地描述了一个不绑定到特定硬件的虚拟机(它可以用齿轮和绳索来实现)。

据我所知,只有 ADA 语言能够详细说明算术的所有特征,但没有达到每个字的位数。


忽略布尔类型是 C 语言中最可悲的设计决定之一。我花了 C99 来整合它:-(

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

于 2018-12-16T19:14:06.850 回答
2

高级语言的重点是提供与机器细节的一些隔离。所以,我们说的是“整数”,而不是某个特定数量的内存字节。然后,该实现将更高级别的类型映射到似乎最适合目标硬件的任何东西上。

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

我知道这是一个 C 问题,关于 C 的高级程度是或不是,这是有争议的;但它至少旨在跨机器架构移植。

而且,在您的示例中,您假设“int”是 32 位。语言中没有任何内容说这必须是真的。这并不总是正确的,在最初的 PDP-11 实施中肯定不是正确的。现在,例如,在 64 位机器上将“int”设置为 64 位可能是合适的。

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

于 2018-12-16T19:23:56.100 回答