03검증 문제
부호 있는 오프셋 더하기
1. 요구 동작
SignedOffset은 8비트 주소 base를 −8부터 7까지의 4비트 부호 있는 delta만큼
이동합니다. addr는 base + delta이며 8비트 안에서 wraparound합니다. 예를 들어
250 + 7은 1이고 3 + (-8)은 251입니다.
시작 코드는 컴파일되고 양수 오프셋도 올바르게 처리합니다. 그러나 음수 오프셋을 더하면
주소가 줄지 않고 오히려 늘어납니다. 100 + (-1)의 출력은 115입니다.
음수 delta가 큰 양수로 해석되는 원인을 찾아 addr 연결을 고치세요. 세 포트의 타입은
그대로 둡니다.
2. 비트 해석과 확장 순서
확장 방식은 값이 넓어지는 순간의 타입이 결정합니다. UInt는 0으로, SInt는 부호
비트의 복사본으로 확장됩니다. asUInt와 asSInt는 비트를 바꾸지 않고 해석만 바꿉니다.
시작 코드에서 delta = -1이 처리되는 과정을 따라가 보세요.
- 4비트 패턴은
1111입니다. asUInt가 이 패턴을 15로 해석합니다.- 8비트
base와 더하기 위해 15가 8비트로 넓어집니다. - 이 단계의 타입이
UInt이므로 상위 4비트가 0으로 채워집니다.
3. 실행 전 예측
공개 실행은 (100, 3), (100, -1), (100, -8), (250, 7) 네 행을 출력합니다.
각 행에서 시작 코드의 출력과 올바른 출력을 예측하고, 결함이 영향을 주는 행을 표시해 보세요.
4. 실행 결과 해석
시작 코드는 103, 115, 108, 1을 출력합니다. 양수 두 행은 250에서의 wraparound까지
정확합니다. −1은 15로, −8(1000)은 8로 해석된 뒤 0 확장되어 각각 115와 108이 됩니다.
입력 비트에는 문제가 없습니다. 값이 넓어지기 전에 해석이 부호 없는 값으로 바뀐 것이
원인입니다. 올바른 출력은 103, 99, 92, 1입니다.
5. 완료 조건
- 0부터 255까지의 모든
base와 −8부터 7까지의 모든delta에서base + delta를 256으로 나눈 나머지를 출력합니다. - 255를 넘는 경우와 0 아래로 내려가는 경우 모두 wraparound합니다.
- 출력된 오프셋만 맞춘다고 완료되지 않습니다. −2부터 −7까지도 동작해야 합니다.
6. 단계형 힌트
힌트 1
1111은 SInt로 해석될 때만 −1입니다. 이 값이 어떤 타입인 상태에서 8비트로
넓어지는지 확인해 보세요.
힌트 2
delta가 아직 SInt일 때 확장이 일어나게 하세요. 덧셈의 두 피연산자가 모두
SInt이면 좁은 쪽이 부호 확장됩니다. 형변환은 비트를 바꾸지 않으므로 base를 SInt로
해석해도 256으로 나눈 나머지는 같습니다. 부호 없는 값으로의 변환은 마지막에 합니다.
개념 설명
asUInt와 asSInt는 비트를 재해석할 뿐 확장하지 않습니다. 한 식 안에서 이 변환과 폭 변경이 함께
일어나면 두 연산의 순서가 결과 값을 결정합니다. 데이터 타입 장의 widebits 예제가 같은
규칙을 보여 줍니다.
7. 추가 실험
base = 200을 8비트 SInt로 해석하면 −56입니다. 부호 있는 덧셈으로 계산해도
200 + (-8)과 250 + 7이 올바른 부호 없는 주소를 출력하는 이유를 설명해 보세요.