> 백엔드 개발 > C++ > 본문

C에서 정수 오버플로로 인해 부호 있는 정수와 부호 없는 정수에 대해 다른 결과가 나타나는 이유는 무엇입니까?

Patricia Arquette
풀어 주다: 2024-11-12 01:37:03
원래의
737명이 탐색했습니다.

Why does integer overflow in C   lead to different results for signed and unsigned integers?

부호 있는/부호 없는 정수 오버플로의 예기치 않은 결과

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의 보수가 사용되며 이로 인해 예기치 않은 래핑 동작이 발생합니다. 예를 들어 위 프로그램에서는

  • x가 0으로 초기화된 후 최대 양수 값인 2147483647로 오버플로됩니다.
  • 이 오버플로된 값에 1이 추가되면 래핑됩니다. 최소 음수 값에 가깝습니다. -2147483648.

부호 없는 정수의 경우 오버플로는 잘 정의되어 있으며 모듈로 2비트를 둘러쌉니다. 즉, 최대값을 넘으면 값이 0으로 재설정됩니다. 이는 y의 출력에 대해 설명합니다. 여기서 y는 부호 없는 최대 값인 4294967295를 오버플로한 후 0으로 돌아갑니다.

부호 있는 정수 오버플로의 동작은 언어에 따라 보장되지 않으며 언어에 따라 다를 수 있다는 점에 유의하는 것이 중요합니다. 구현 및 기계 아키텍처. 따라서 일반적으로 프로그램에서 이러한 동작에 의존하는 것은 권장되지 않습니다.

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿