C++中的无符号算术

Zhe*_*hen 11 c++

我只是在做无符号算术时发现了一个奇怪的现象.它的预期,b并且-a具有相同数量4294967286由于环绕,但实际输出b-a-104294967286分别.任何人都可以帮忙提一下吗?

#include <iostream>

int main() {
  unsigned int a = 10;
  int b = -a;
  std::cout << b << ", " << -a << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

https://repl.it/repls/ExpertDrabOrganization

Bat*_*eba 17

-a在被评估unsigned的算术,和将是一个数较大的std::numeric_limits<int>::max().-应用于unsigned类型时,一元运算符更像模数运算符.

因此,你的程序的行为是实现定义因超出范围的分配的int.

  • *实现*定义 - 即查看文档,如果他们不做他们的承诺,就会对你的实施者大喊大叫. (3认同)
  • @Angew - 有趣的是,它的实现是在C99草案中定义的.似乎*转换*总是与实现定义的语义.无论我在哪里检查,带有签名类型的算术溢出都是UB.好奇. (2认同)