我对C语言标准中的数据类型提升规则有疑问。 C99说:
C整数提升还要求“如果一个int可以表示原始类型的所有值,则该值将转换为int;否则,它将转换为unsigned int。”
我的问题是在C语言表达式中,unsigned int
和signed int
存在,哪种类型会被提升为什么类型?
E.g。 int
无法代表unsigned int
的所有值(大于MAX_INT
值的值),而unsigned int
无法表示-ve值,因此将哪种类型提升为此类值例
答案 0 :(得分:43)
我认为你混淆了两件事。 Promotion 是整数类型“较小”的值,int / unsigned int转换为int或unsigned int的过程。这些规则表达得有些奇怪(主要是为了处理充分的char),但要确保价值和符号得到保护。
然后存在通常的算术转换的不同概念,通过算术运算符的操作数被转换为公共类型。它首先提升操作数(int或unsigned),如果它们的类型小于int,然后通过以下过程选择目标类型(对于整数类型,6.3.1.8 / 1)
如果两个操作数具有相同的类型,则不需要进一步转换。
否则,如果两个操作数都有有符号整数类型或两者都有无符号 整数类型,具有较小整数转换等级类型的操作数是 转换为具有更高等级的操作数的类型。
否则,如果具有无符号整数类型的操作数的等级大于或等于 等于另一个操作数的类型的等级,然后是操作数 有符号整数类型转换为带有unsigned的操作数的类型 整数类型。
否则,如果带有符号整数类型的操作数的类型可以表示 那么,带有无符号整数类型的操作数类型的所有值 具有无符号整数类型的操作数将转换为该类型 带有符号整数类型的操作数。
否则,两个操作数都将转换为无符号整数类型 对应于带有符号整数类型的操作数的类型。
(请注意,这些规则在C89和C99之间略有改变的ISTR)
答案 1 :(得分:24)
我认为以下内容可以回答您的问题:
6.3.1.3有符号和无符号整数
1 当整数类型的值为 转换为另一种整数类型 除了_Bool,如果值可以 由新类型代表,它是 不变。
2 否则,如果是新的 type是无符号的,值是 通过反复添加或转换 减去一个以上的最大值 可以在中表示的值 新类型,直到值在 新类型的范围。
3 否则, 新类型是签名和值 不能代表它;或 结果是实现定义的 或者是实现定义的信号 提高。