如果我这样做会发生什么:
unsigned int u;
int s;
...
s -= u;
预期的行为是什么:
1)假设无符号整数不是太大而不适合有符号整数?
2)假设无符号整数会溢出有符号整数?
感谢。
答案 0 :(得分:14)
一般情况下,请参阅标准中的5/9。
在您的示例中, signed 值将转换为 unsigned (通过将其设为mod UINT_MAX + 1),然后以UINT_MAX + 1为模进行减法,得到一个未签名的结果。
将此结果作为带符号值存储回s
涉及标准积分转换 - 这是4.7 / 3。如果该值在signed int
范围内,则保留该值,否则该值是实现定义的。我曾经看过的所有实现都使用模运算将它推到INT_MIN
到INT_MAX
的范围内,尽管Krit说你可能会暗中暗示这样做。
+/- (UNIT_MAX+1)/2
表示为int。
同样相关的是5.17 / 7,“E1 op= E2
形式的表达式的行为等同于E1 = E1 op E2
,除了E1
仅被评估一次”。这意味着,为了说减法是在unsigned int
类型中完成的,我们需要知道的是s - u
在unsigned int
中完成:{{1}没有特殊规则算术应该在LHS的类型中完成。
答案 1 :(得分:-1)
u重铸为有符号整数并从s中减去。最终,铸造没有任何区别。从另一组中减去一组位,结果进入s。