如果我做这样的事情会发生什么:
unsigned int u;
int s;
...
s -= u;
Run Code Online (Sandbox Code Playgroud)
这个的预期行为是什么:
1)假设无符号整数不是太大而不适合有符号整数?
2)假设无符号整数会溢出有符号整数?
谢谢.
Ste*_*sop 14
一般来说,请参阅标准中的5/9.
在您的示例中,有符号值将转换为无符号(通过将其设置为UINT_MAX + 1),然后以UINT_MAX + 1为模进行减法以得到无符号结果.
将此结果作为有符号值存储回s标准积分转换 - 这是4.7/3.如果该值在范围内,signed int则保留该值,否则该值是实现定义的.所有我曾经看着的实现已经使用模运算将其推入范围INT_MIN到INT_MAX,虽然作为Krit的说,你可能会得到隐含这样一个警告.
您可能永远不会处理的"特技"实现可能对unsigned-> signed转换有不同的规则.例如,如果实现具有有符号整数的符号幅度表示,则不可能总是通过取模数进行转换,因为无法表示+/- (UNIT_MAX+1)/2为int.
同样相关的是5.17/7,"表单表达式的行为E1 op= E2等同于E1 = E1 op E2仅E1评估一次".这意味着,为了说减法是在做unsigned int类型,我们需要知道的是,s - u做是unsigned int:有没有为特殊规则-=应在LHS的类型做算术.