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의 보수 표현을 사용합니다. 이는 이 프로그램에서 관찰된 특정 결과를 설명합니다.
1을 더하면 POS_MAX:
0111 + 1 = 1000
선행 비트가 설정되어 있으므로 음수입니다. 실제 값을 찾기 위해 2의 보수 역을 수행합니다.
1000 - 1 = 0111 ~0111 = 1000 = -8
따라서 최종 값은 -8이며 프로그램 출력에 나타납니다.
위 내용은 C에서 정수 오버플로가 예상치 못한 결과를 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!