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

C++ 当我从C+;中的有符号整数中减去一个无符号整数时会发生什么+;?,c++,math,C++,Math,如果我这样做会发生什么: unsigned int u; int s; ... s -= u; 这种情况下的预期行为是什么: 1) 假设无符号整数不是太大而无法放入有符号整数中 2) 假设无符号整数将溢出有符号整数 谢谢。u被重铸为有符号整数,并从s中减去。最终,演员阵容没有任何区别。一组位从另一组位中减去,结果进入s。通常,参考标准中的5/9 在您的示例中,将有符号值转换为无符号值(取mod UINT_MAX+1),然后以模UINT_MAX+1进行减法,以得到无符号结果 将此结果作为有符号

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

unsigned int u;
int s;

...
s -= u;
这种情况下的预期行为是什么:

1) 假设无符号整数不是太大而无法放入有符号整数中

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


谢谢。

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

通常,参考标准中的5/9

在您的示例中,将有符号值转换为无符号值(取mod UINT_MAX+1),然后以模UINT_MAX+1进行减法,以得到无符号结果

将此结果作为有符号值存储回
s
涉及标准积分转换-这在4.7/3中。如果该值在
带符号int
范围内,则将保留该值,否则该值由实现定义。我看过的所有实现都使用了模运算将其推到
INT\u MIN
INT\u MAX
的范围内,尽管正如Krit所说,隐式地这样做可能会得到警告

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


同样相关的还有5.17/7,“形式为
E1 op=E2
的表达式的行为等同于
E1=E1 op E2
,但
E1
仅评估一次”。这意味着,为了说减法是在
无符号int
类型中进行的,我们需要知道的是
s-u
是在
无符号int
类型中进行的:
-=
没有特殊规则规定算术应该在LHS类型中进行。

可能的重复不是完全重复。这个问题的最后一个赋值是一个无符号的变量,因此算法是相同的,但最后一个赋值是不同的。同样值得一看::)只是提醒一下,“实现定义的结果”可能是一个“实现定义的信号”。(C标准在这方面更清楚)在实践中,在两个补码机上得到正确的结果,在别处得到错误的结果。杰姆斯:我认为这是C++和C之间的有意区别。C++的措辞非常清楚,“值是实现定义的”。它没有说“行为是实现定义的”,这将允许一个信号。这个答案与引用标准的公认答案不一致。