为什么无符号整型提升为有符号整型? [英] Why do unsigned "small" integers promote to signed int?

查看:21
本文介绍了为什么无符号整型提升为有符号整型?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

标准很明确:当对小于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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆