2017-02-08 10 views
1

는, GCC는 때때로 나에게 말한다 / 또는 %>> 또는 &을 단순화 때이 재현 가능한 테스트 케이스를 만들기 위해 실패
[-Wstrict-overflow]부서를 오른쪽 시프트로 변경할 때 부호있는 오버플로가 발생할 수 있습니까? 최적화 할 때

발생하지 않습니다 서명 오버 플로우를 가정

이를 위해 내 생산 코드에는 다음과 같은 것이 포함되어 있습니다.

int left = a.left() + (a.width() - b.width())/2; 

모든 메소드가 int 값을 반환합니다.

/2>>1으로 바꾸거나 (예 : %4&3으로 바꾸는 것이 정수 오버플로를 유발할 수있는 이유는 무엇입니까?

+0

>> 부호있는 정수의 경우 구현에 따라 다릅니다. 참조하십시오 : http://stackoverflow.com/questions/11644362/are-the-results-of-bitwise-operations-on-signed-integers-defined – virgesmith

+0

결과가 ** undefined 일 수 있다는 경고를 오해 한 것 같습니다. **. 하지만 ** 구현 정의 **라고 말하고 있습니다. 어느 쪽이 그렇게 나쁘지는 않지만 경고를받는 것이 여전히 유용합니다. –

+1

이것은 컴파일러가 대상을 알아야하므로 예를 들어'/'를'/'로 대체 한 * 프로그래머 *와는 다릅니다. –

답변

1

새 비트를 부호 비트로 이동하면 예기치 않은 결과가 발생합니다. 1001 (부호있는 소수 : 7) >> 1 결과는 0100 (부호있는 소수 : 4)입니다. 적어도 2의 보수를 사용하는 구현은 대다수입니다.

편집 : x86의 경우, 부호 비트를 보존하는 시프트 명령어가 있습니다.

+0

마지막으로 확인한 이진수 1001은 십진수 9, 9/2 == 4였습니다. 컴파일러가 인수가 (부호가있는) 정수임을 알고 있다면, (a) 서명 된 오른쪽 시프트를 사용하거나 (에뮬레이트)하거나 (b) 그것이 불합리하다는 것을 알고 있다면이 단순화를 건너 뛸 것으로 기대합니다. –