정수 오버플로-왜[중복]
-
14-11-2019 - |
문제
가능한 중복:
두 개의 문자를 추가하면
주어진 다음 기음++코드:
unsigned char a = 200;
unsigned char b = 100;
unsigned char c = (a + b) / 2;
출력은 150 입니다. 논리적으로 그러나 식에 정수 오버플로가 없어야 합니다 (a + b)
?
분명히 여기에 오버플로를 처리 할 수있는 정수 승진이 있어야합니다,또는 내가 볼 수없는 다른 일이 일어나고 있습니다.누군가가 나를 계몽 할 수 있는지 궁금해서 정수 승격 및 오버플로 측면에서 내가 의지 할 수 있고 의지해서는 안되는 것이 무엇인지 알 수 있습니다.
해결책
둘 다 씨++아니 씨"작은"정수 유형을 사용하여 산술 계산을 수행합니다., char
그리고 short
.이러한 유형은 거의 항상 승진 int
추가 계산이 시작되기 전에그래서,당신의 표현은 정말로 다음과 같이 평가됩니다
unsigned char c = ((int) a + (int) b) / 2;
추신:일부 이국적인 플랫폼에서 int
범위를 커버하지 않습니다 unsigned char
,유형 unsigned int
홍보 대상 유형으로 사용됩니다.
다른 팁
아니,이 오류가 아닙니다.
컴파일러는 항상 최소 정수 정밀도로 계산하며,결과는 할당 시에만 부호 없는 문자로 다시 변환됩니다.
이 표준입니다.
다른 답변에 따르면 오류가 아닙니다 86 및 기타(제정신)32 비트 및 16 비트 아키텍처에.
그러나 작거나 덜 제정신 인 아키텍처(일반적으로 매우 작은 마이크로 컨트롤러)에서는 특히 컴파일러를 구현 한 사람이 일부 대기업(다시 마이크로 컨트롤러)의 테스트/유효성 검사 예산이없는 경우 문제가 발생하기 시작할 것입니다.
제휴하지 않습니다 StackOverflow