Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的无符号算术+;_C++ - Fatal编程技术网

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,此行为无法确保: