我知道“自然大小”是一种由特定硬件最有效处理的整数宽度。当使用short
在数组或算术运算中时,必须先将short
整数转换为int
。
问:到底是什么决定了这个“自然大小”?
我不想要简单的答案,例如:
如果它有32位架构,则自然大小为32位
我想要明白为什么这是最有效的,以及为什么在对其进行算术运算之前必须将short
转换。
额外问题:当对一个long
整数进行算术运算时会发生什么?
我知道“自然大小”是一种由特定硬件最有效处理的整数宽度。当使用short
在数组或算术运算中时,必须先将short
整数转换为int
。
问:到底是什么决定了这个“自然大小”?
我不想要简单的答案,例如:
如果它有32位架构,则自然大小为32位
我想要明白为什么这是最有效的,以及为什么在对其进行算术运算之前必须将short
转换。
额外问题:当对一个long
整数进行算术运算时会发生什么?
short
提升为int
,因为这是C语言中的方式,并且C++在没有或几乎没有理由改变它的情况下继承了这种行为,可能会破坏现有的代码。我不确定最初将其添加到C语言的原因,但可以推测它与“默认int”有关,即如果未指定类型,则编译器假定为int
。许多二进制运算符期望算术或枚举类型的操作数,以类似的方式进行转换并生成结果类型。目的是产生一个公共类型,也是结果类型。这种模式称为通常的算术转换,其定义如下:
然后具体感兴趣:否则,将对两个操作数执行整数晋升(4.5)
- 然后,如果任一操作数为unsigned long,则另一个操作数应转换为unsigned long。
- 否则,如果一个操作数是long int而另一个操作数是unsigned int,则如果long int可以表示所有unsigned int的值,则将unsigned int转换为long int;否则,两个操作数都应转换为unsigned long int。
- 否则,如果任一操作数为long,则另一个操作数应转换为long。
总之,编译器尝试使用“最好”的类型来进行二进制运算,其中int
是使用的最小大小。int8 = int8 + int16
完全通过8位操作进行,而不管所涉及的推广类型。 - Sneftelint
设置为64位的主要原因是,在64位系统上只剩下两种标准整数类型(char
和short
)来覆盖三种不同的大小(8、16和32位)。为了使ILP64模型工作,您需要一个额外的类型(short short
?),但LP64和LLP64与现有的语言定义兼容。这在http://www.unix.org/version2/whatsnew/lp64_wp.html中有详细讨论。 - dan04