【发布时间】:2014-03-10 15:06:54
【问题描述】:
这个话题在很多情况下都被大量讨论过。当我搜索并阅读一些帖子时。我被以下帖子弄糊涂了。
Signed to unsigned conversion in C - is it always safe?
以下是原题。
unsigned int u = 1234;
int i = -5678;
unsigned int result = u + i;
答案简单引用了“6.3.1.8 常用算术转换”第 3 点,即
否则,如果无符号整数类型的操作数的秩大于或等于另一个操作数类型的秩,则将有符号整数类型的操作数转换为无符号整数类型的操作数的类型。
但是,如果我的理解是正确的,整数提升应该在之前考虑“通常的算术转换”。
规则是
如果 int 可以表示原始类型的所有值,则该值将转换为 int 。否则,它将转换为 unsigned int 。这些转换规则称为积分提升
所以,这意味着添加是用 signed int 类型而不是 unsigned int 类型完成的。当将负数分配给 unsigned int 结果时,会发生向大值的转换。
我对自己的理解有点不自信。有没有人对那个帖子有类似的困惑?
欢迎任何回复或评论。提前感谢!
杰夫
【问题讨论】:
标签: c type-conversion integer-promotion