理解有符号/无符号整数溢出
在学习 C 整数溢出的过程中,出现了以下问题:
为什么我用有符号/无符号整数获得这些结果溢出?”
程序:
#include <iostream> int main() { int x(0); std::cout << x << std::endl; x = x + 2147483647; std::cout << x << std::endl; x = x + 1; std::cout << x << std::endl; std::cout << std::endl; unsigned int y(0); std::cout << y << std::endl; y = y + 4294967295; std::cout << y << std::endl; y = y + 1; std::cout << y << std::endl; }
输出:
0 2147483647 -2147483648 0 4294967295 0
解释:
理解整数C 中的溢出需要了解有符号和无符号整数类型。
有符号整数溢出被视为未定义行为,这意味着编译器不需要指定有符号整数溢出时的确切行为。在实践中,大多数实现都存储有符号。使用 2 的补码表示的整数 这意味着当有符号整数溢出时,其值会“回绕”到负范围。在本示例中,使用有符号整数将 1 添加到最大正整数 (2147483647),结果为 -2147483648。最小负整数。
相反,无符号整数溢出是明确定义的,当值超过最大值时,值会回零。在示例中,最大无符号整数 (4294967295) 加 1 会得到 0。这是因为无符号整数没有负值的概念。
以上是为什么整数溢出会导致有符号和无符号整数的不同行为?的详细内容。更多信息请关注PHP中文网其他相关文章!