C++ C+中的无符号算术+;
我只是在做无符号算术时观察到一个奇怪的现象。由于封装,预计C++ C+中的无符号算术+;,c++,C++,我只是在做无符号算术时观察到一个奇怪的现象。由于封装,预计b和-a具有相同的编号4294967286,但b和-a的实际输出分别为-10和4294967286。有人能给个提示吗 #include <iostream> int main() { unsigned int a = 10; int b = -a; std::cout << b << ", " << -a << std::endl; } #包括 int main(
b
和-a
具有相同的编号4294967286
,但b
和-a
的实际输出分别为-10
和4294967286
。有人能给个提示吗
#include <iostream>
int main() {
unsigned int a = 10;
int b = -a;
std::cout << b << ", " << -a << std::endl;
}
#包括
int main(){
无符号整数a=10;
int b=-a;
std::cout-a
在无符号
算术中计算,其数值将大于。一元运算符-
应用于无符号
类型时,其作用更像模运算符
因此,由于对int
的赋值超出范围,程序的行为是由实现定义的。为什么您希望int
的值为4294967286,这远大于最大值int
?int b=-a;
->无符号int b=-a;
@molbdnilo我的错误。我放弃了ot那b
也会溢出。实现定义-也就是说,看看文档,如果你的实现者没有履行承诺,就对他们大喊大叫。@StoryTeller:从哪个华而不实的新标准开始?@StoryTeller它也是在C++03中定义的实现。@Angew-有趣的是,它是在我手头的C99草案中定义的实现。I转换似乎总是使用实现定义的语义。但是,无论我在哪里检查,带符号类型的算术中的溢出都是UB。quirier.gcc实现定义的行为:。因此对于clang也是如此。对于MSVC,此行为无法确保: