머신러닝과 기술적 분석

음수의 Bit Shift 연산시 주의사항 본문

카테고리 없음

음수의 Bit Shift 연산시 주의사항

BetterToday 2017. 8. 16. 12:01
728x90

임베디드 환경에서는 연산속도가 중요하기 때문에 으로 나누는 연산의 경우 나눗셈보다는 right bit-shift 연산을 사용하게 된다.
하지만 음수의 경우에는 right bit-shift 연산을 사용할 때 주의할 점이 있다.

1. 140 >> 10 의 결과는 ?

140을 right shift 10 했으므로 140 / 1024 를 연산한 0이 된다.

2. -140 >> 10 의 결과는 ?

-140을 right shift 10 했으므로 -140 / 1024 를 연산한 0이 될줄 알고 코딩했던 적이 있다.
gcc compiler 와 visual c++ compiler 모두가 0이 되지 않는다.

#include <stdio.h>

int main()
{
    printf("140 >> 10 = %d\n", 140>>10);
    printf("-140 >> 10 = %d\n", -140>>10);

}

위와 같은 코드를 실행해보면

140 >> 10 = 0
-140 >> 10 = -1

이 된다.

3. 왜 -140 >> 10 의 결과가 -1 일까?

컴퓨터 입장에서 생각해보자. -140 >> 10 이라는 code 는 말그대로 -140 을 10칸 right shift 한 것이다.

3.1 -140이 메모리에 저장되는 방식? (16비트라고 가정)

140 == 이므로 0000_0000_1001_0000(2) 로 저장된다.
-140은 140의 2’s complement 이므로

-140 == 1111_1111_0110_1111(2) + 0000_0000_0000_0001(2) == 1111_1111_0111_0000(2) 이 된다.

3.2 -140 == 1111_1111_0111_0000(2) 를 right shift 10 하면?

xxxx_xxxx_xx11_1111(2) 가 된다. 여기서 “x” 표시는 예측할 수 없다는 뜻이다.
앞서 살펴본 gcc compiler 와 visual c++ compiler 의 경우는 “x” 가 모두 1로 채워져서

-140 >> 10 == -1 이 되었던 것이다.

정리

음수의 나눗셈을 right bit shift 로 대체하는 경우에는 주의해서 사용해야 한다.

M >> N의 연산에서 M <0 && M < 2^N 이 성립할 경우 결과를 “0” 으로 예상하기 쉽지만 gcc compiler 와 visual c++ compiler 의 경우 “-1” 이 된다.

이러한 경우에는 compiler 마다 결과값에 차이가 있다고 한다.

728x90
반응형
Comments