>백엔드 개발 >C++ >C에서 정수 오버플로가 예상치 못한 결과를 생성하는 이유는 무엇입니까?

C에서 정수 오버플로가 예상치 못한 결과를 생성하는 이유는 무엇입니까?

DDD
DDD원래의
2024-11-12 16:47:01216검색

Why Does Integer Overflow Produce Unexpected Results in C  ?

C에서 정수 오버플로로 인한 예기치 않은 결과

정수 유형으로 작업할 때 오버플로의 의미를 이해하는 것이 중요합니다. 이 게시물에서는 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

부호 있는 정수 오버플로

부호 있는 정수 오버플로는 정의되지 않은 동작입니다. 이는 이 경우와 같이 잘못된 결과를 생성하는 것을 포함하여 컴파일러가 원하는 모든 작업을 수행할 수 있음을 의미합니다.

부호 없는 정수 오버플로

반면, 부호 없는 정수 오버플로는 잘됩니다. -한정된. 값은 2^비트로 모듈로 나누기와 유사하게 순환됩니다(여기서 비트는 데이터 유형의 비트 수입니다). 32비트 int가 있으므로:

4294967295 + 1 = 4294967296 % 2^32 = 0

특정 구현 세부 정보

부호 정수 오버플로가 정의되지 않은 동작임에도 불구하고 대부분의 구현에서는 2의 보수 표현을 사용합니다. 이는 이 프로그램에서 관찰된 특정 결과를 설명합니다.

  • POS_MAX(최대 양수 값) = 7(0111)
  • NEG_MAX(최대 음수 값) = -8(1000)

1을 더하면 POS_MAX:

0111 + 1 = 1000

선행 비트가 설정되어 있으므로 음수입니다. 실제 값을 찾기 위해 2의 보수 역을 수행합니다.

1000 - 1 = 0111
~0111 = 1000 = -8

따라서 최종 값은 -8이며 프로그램 출력에 나타납니다.

위 내용은 C에서 정수 오버플로가 예상치 못한 결과를 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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