>백엔드 개발 >C++ >정수 오버플로로 인해 부호 있는 정수와 부호 없는 정수에 대해 서로 다른 동작이 발생하는 이유는 무엇입니까?

정수 오버플로로 인해 부호 있는 정수와 부호 없는 정수에 대해 서로 다른 동작이 발생하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-17 08:15:03939검색

Why does integer overflow result in different behavior for signed and unsigned integers?

Signed/Unsigned Integer Overflow 이해

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의 보수 표현을 사용하여 부호 있는 정수를 저장합니다. 이는 부호 있는 정수가 오버플로되면 해당 값이 음수 범위로 "순환"됨을 의미합니다. 이 예에서는 부호 있는 정수를 사용하여 최대 양의 정수(2147483647)에 1을 더합니다. 정수 결과는 최소 음수인 -2147483648입니다.

  • 부호 없는 정수 오버플로:

반면, 부호 없는 정수 오버플로는 잘됩니다. -정의, 최대값을 초과하면 값이 0으로 돌아갑니다. 예시에서는 부호 없는 정수의 최대값(4294967295)에 1을 더하면 0이 됩니다. 이는 부호 없는 정수에는 음수라는 개념이 없기 때문입니다.

위 내용은 정수 오버플로로 인해 부호 있는 정수와 부호 없는 정수에 대해 서로 다른 동작이 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.