문제

가능한 중복:
두 개의 문자를 추가하면

주어진 다음 기음++코드:

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 비트 아키텍처에.

그러나 작거나 덜 제정신 인 아키텍처(일반적으로 매우 작은 마이크로 컨트롤러)에서는 특히 컴파일러를 구현 한 사람이 일부 대기업(다시 마이크로 컨트롤러)의 테스트/유효성 검사 예산이없는 경우 문제가 발생하기 시작할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top