当我从C ++中的有符号整数中减去无符号整数时会发生什么?

时间:2011-03-16 16:57:06

标签: c++ math

如果我这样做会发生什么:

unsigned int u;
int s;

...
s -= u;

预期的行为是什么:

1)假设无符号整数不是太大而不适合有符号整数?

2)假设无符号整数会溢出有符号整数?

感谢。

2 个答案:

答案 0 :(得分:14)

一般情况下,请参阅标准中的5/9。

在您的示例中, signed 值将转换为 unsigned (通过将其设为mod UINT_MAX + 1),然后以UINT_MAX + 1为模进行减法,得到一个未签名的结果。

将此结果作为带符号值存储回s涉及标准积分转换 - 这是4.7 / 3。如果该值在signed int范围内,则保留该值,否则该值是实现定义的。我曾经看过的所有实现都使用模运算将它推到INT_MININT_MAX的范围内,尽管Krit说你可能会暗中暗示这样做。

您可能永远不会处理的“特技”实施可能对unsigned->签名转换有不同的规则。例如,如果实现具有有符号整数的符号幅度表示,则不可能总是通过取模数进行转换,因为无法将+/- (UNIT_MAX+1)/2表示为int。

同样相关的是5.17 / 7,“E1 op= E2形式的表达式的行为等同于E1 = E1 op E2,除了E1仅被评估一次”。这意味着,为了说减法是在unsigned int类型中完成的,我们需要知道的是s - uunsigned int中完成:{{1}没有特殊规则算术应该在LHS的类型中完成。

答案 1 :(得分:-1)

u重铸为有符号整数并从s中减去。最终,铸造没有任何区别。从另一组中减去一组位,结果进入s。