为什么无符号整型提升为有符号整型? [英] Why do unsigned "small" integers promote to signed int?
问题描述
标准很明确:当对小于int
的整型进行算术运算时,首先将该整数提升为有符号int
,除非int
不能代表原始类型的全值范围,在这种情况下,提升为unsigned int
。
我的问题是:什么是(曾经?)这项政策的动机是什么?为什么将无符号类型提升为有符号int
,而不是始终为unsigned int
?
当然,在实践中几乎没有区别,因为底层汇编指令是相同的(只是零扩展),但升级到signed int
有一个关键的缺点,没有明显的优点,因为溢出在有符号算术中是UB的,但在无符号算术中定义得很好。
选择签名int
有历史原因吗?是否存在不使用二进制补码运算的体系结构,其中将小型无符号类型提升为有符号int
而不是unsigned int
更容易/更快?
编辑:我认为这是显而易见的,但我在这里寻找的是事实(即解释设计决定的一些文档或参考资料),而不是"主要基于意见"的推测。
推荐答案
ANSI C Rationale(链接指向相关部分,3.2.1.1)。在某种程度上,这是一个武断的选择,可能会有两种结果,但做出这种选择是有原因的。
自《K&;R》出版以来, C语言在积分提升规则演化中的实现。 实现分为两大阵营,它们可能具有以下特点 作为无符号保留和保留值。不同之处在于 这些方法之间的中心是
unsigned char
的治疗 和unsigned short
,当被积分促销扩大时,但是 该决定对常量的类型也有影响(请参见 §3.1.3.2)。无符号保留方法需要提升两个较小的 到
unsigned int
的无符号类型。这是一条简单的规则,并产生一个 独立于执行环境的类型。保值方法要求将这些类型提升为
signed int
,如果该类型可以正确表示 原始类型,否则用于将这些类型提升为unsigned int
。因此,如果执行环境表示short
当小于int
时,unsigned short
变为int
; 否则将变为unsigned int
。
[截图]
无符号保存规则极大地增加了算法的数量unsigned int
面对signed int
以产生 签名有问题的结果,而保值规则 将这种对抗降至最低。因此,保值规则是 被认为对初学者或粗心大意的程序员来说更安全。之后 经过多次讨论,委员会决定支持保值 规则,尽管UNIXC编译器已经在 无符号保留方向。
(我建议阅读整个部分。我只是不想在这里引用整件事。)
这篇关于为什么无符号整型提升为有符号整型?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!