当我们看一些基本数据类型(例如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
答案 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概念级别相同的语言,其机器字是唯一的内置数据类型。