완료됨
어셈블리 sal, sar, shl, shr 관련해서 이해가 안가는 부분이 있습니다!..

wargame 문제를 푸는 중에 sar을 찾아보다 한 가지 궁금한 게 생겼습니다. shl, shr의 경우 부호 없는(부호가 유지되지 않는) shift 연산자이고 sal, sar의 경우 부호가 있는(부호가 유지되는) shift 연산자라는 것까지는 이해가 되었습니다.

sar의 동작 설명 중에서 부호 비트가 맨 왼쪽인 MSB에 있는데 이때 오른쪽으로 shift할 경우 MSB가 0으로 채워지기 때문에 자기 자신으로 한번 더 shift를 함으로써 부호를 유지한다는 것까지도 납득이 가능했습니다.

근데 설명에서 sal의 경우 shl과 동일하게 동작한다고 하는데 여기서 한 가지 궁금한 게 왼쪽으로 shift를 하다보면 결국 MSB 값에도 변화가 생길 것이라고 받아들였는데 이렇게 될 경우 부호에 변화가 생기는 것이 아닌가요?..


  • 만약 1 byte 크기의 부호가 있는 -5가 있다고 하였을 때
sal로 2만큼 shift 하였을 경우
1000 1001 -> 0010 0100

요렇게 되면 부호가 바뀌게 되는 것 아닌가요?.. 아님 제가 놓친 다른 내용이 있는 건가요??

#assembly #shift
작성자 정보
더 깊이 있는 답변이 필요할 때
드림핵 팀과 멘토에게 직접 문의해 보세요!
답변 1
Karatus
워게임: 50
Karatus
워게임: 50

가정

예제로 주신 1000 1001가 8-bit 변수에, 맨 첫 비트(MSB)를 signed bit, 그리고 2의 보수 특징을 가진다고 가정합시다.
위의 변수가 가질 수 있는 값의 범위는 -256 ~ 255까지입니다.

계산

예제의 값은 2의 보수로 계산했을 때 -119입니다.
아시다시피 n-bit을 왼쪽으로 shift한다는 것은 해당 값 * (2 ^ n)을 하는 효과와 같습니다.

sal로 2만큼 shift한다는 건 즉,
-119 * 2 ^ 2 = -476이 됩니다.
하지만 이 숫자는 변수가 가질 수 있는 범위를 초과합니다. 결국 underflow가 일어나게 됩니다.
-256을 초과하는 분만큼을 계산하면 딱 36이라는 값이 나옵니다.
가정에 맞게 bit를 구성하면 0010 0100이 되네요.

결론

맞습니다.
질문하셨던 대로 부호가 바뀌게 됩니다.
그 이유는 컴퓨터의 OS에 따라 담을 수 있는 변수의 크기가 달라짐으로 인해 해당 bit수를 넘어가는 경우가 생깁니다.
이 경우 값의 손실, 혹은 변경이 일어날 수 있습니다.
ex) overflow, underflow

bit 계산을 할 때에는 bit수가 한정되어있다는 점을 항상 염두해두셔야 합니다.
이상입니다.

2021.01.30. 19:39