해결된 질문
작성
·
58
1
안녕하세요.
[1. 질문 챕터] : HDL 9장, 5분 50초
[2. 질문 내용] : Unsigned 연산 결과인 156이 -100의 2의 보수가 되는 원리가 궁금합니다.
[3. 시도했던 내용, 그렇게 생각하는 이유] : Unsigned A : 01100100 (십진수 : 100), Unsigned B : 11001000(십진수 : 200)
강의에서, 2의 보수 위키백과 내용 중, '2의 보수는 대부분의 산술연산에서 원래 숫자의 음수처럼 취급한다'. (2분 57초)
A - B = A + (-B) = 01100100 + 00111000 = 10011100 (십진수 : 156)
이를 통해, Unsigned 연산 결과 156이 나온 원리를 알았습니다.
하지만, A, B를 signed type이라고 가정했을 때의 결과인 -100이 unsigned type으로 정의한 A, B의 연산 결과의 2의 보수값이 되는 원리를 정확히 모르겠습니다.
8bit 중, MSB를 취급하는 방법이 완전히 다른데, 어떻게 2의 보수 관계가 되나요?
답변 2
1
안녕하세요 🙂
AI 인턴이 답을 잘 달아주었는데요.
Unsigned
로 연산한 결과인 156
이 signed 연산의 결과인 -100
의 2의 보수가 되는 이유 를 질문하신 걸로 이해했습니다.
기본 개념을 먼저 보시면,
Unsigned: 모든 비트를 숫자로 해석.
예: 8-bit에서 11001000
은 unsigned
로 200.
Signed: MSB를 부호 비트로 사용.
MSB가 0
이면 양수, 1
이면 음수.
예: 8-bit에서 11001000
은 signed
로 -56 (-(256 - 200)
).
Signed 연산에서 음수를 표현하는 방식:
음수 -X
는 2의 보수로 표현.
2의 보수
= 모든 비트를 뒤집고 +1.
예: -100
의 8-bit 표현은 10011100
.
=================
여기서 핵심은, 8bit 는
signed 일때 range : -128 ~ 127
unsigned 일때 range : 0 ~ 255
이며, 이것은 Signed 타입 일때의 해석과, unsigned type 일때의 해석이 다르다, 그리고 8 bit 는 순환 한다는 것입니다.
156
이 Signed 결과 -100
의 2의 보수가 되는 원리핵심 원리: 이 관계는 이진수의 모듈러 연산 특성 때문입니다.
모든 연산은 고정된 비트수(예: 8-bit)에서 수행되고, 오버플로우는 무시됩니다.
따라서 8-bit에서는 숫자가 0~255로 순환(modulo 256).
이 때문에 Signed와 Unsigned에서 결과 해석이 달라지더라도 이진수는 동일.
MSB는 Signed 연산에서 음수 여부를 나타내는 부호 비트로 사용.
Unsigned에서는 MSB도 단순 숫자로 간주.
8-bit에서 가능한 값은 0~255
로 순환:
100
에서 200
을 뺀 결과는 156
.
Unsigned 156
은 Signed로 -100
.
Unsigned 연산 결과 156
은 Signed 연산의 결과 -100
과 2의 보수 관계에 있습니다.
이는 고정된 비트수에서의 모듈러 연산 특성과 Signed/Unsigned 해석 방식의 차이 때문입니다.
즐공하세요 🙂
0
안녕하세요, 인프런 AI 인턴입니다.
dlgigi324님께서 Verilog HDL 9장에서 2의 보수 관련하여 질문하신 부분에 대해 설명드리겠습니다.
먼저, 2의 보수는 컴퓨터 시스템에서 연산의 결과를 간단하게 음수로 표현하는 데 사용됩니다. 2의 보수 연산을 수행할 때, 일반적으로 양수 값을 반전(NOT 연산)한 후 1을 더함으로써 음수를 얻을 수 있습니다. 이는 컴퓨터 산술에서 별도의 보정없이 간단하게 덧셈 연산을 수행할 수 있게 해줍니다.
구체적으로, A와 B가 각각 8비트로 표현된 경우, A가 100이고 B가 200이라고 가정해봅시다:
01100100
(100)11001000
(-56, 반전 후 1을 더하면 -B의 2의 보수가 됨)여기서 A - B 연산은 사실상 A + (-B)처럼 구현됩니다. B를 반전(NOT) 시키고 1을 더하여 -B를 구한 후 A와 더하는 것이죠.
00110111
00111000
(+1)이 2의 보수인 00111000
을 A (01100100
)에 더하면 10011100
이 됩니다. 이 결과는 unsigned
에서 156
으로 해석되고, signed
에서는 -100
으로 해석됩니다.
이와 같은 차이는 연산의 결과를 해석하는 방식에서 발생합니다. MSB를 부호 비트로 볼 것인지, 그냥 비트의 일부분으로 볼 것인지에 따라 signed와 unsigned 숫자가 다르게 보이는 것이죠.
이와 관련하여 도움이 될 수 있는 몇 가지 링크를 추천드립니다:
FPGA 연산 관련 질문 - 이 질문에서도 signed, unsigned 연산에 관련된 원리를 설명합니다.
비트 연산 및 오버플로우 - 2의 보수 연산에 대한 추가적인 이해를 도울 수 있는 내용이 포함되어 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
모듈러 연산의 순환 개념을 알게 해주셔서 감사합니다 !!
연산 결과 A - B = -100
고정된 비트수에서의 모듈러 연산 특성에 의해, -100은 Unsigned로 표현되길 156이 된다.