안녕하세요 길벗수험서 운영팀입니다.
먼저 하나를 가정해두셔야 합니다.
"컴퓨터에서는 음수를 2의 보수로 처리한다." 입니다.
not을 사용하게 되면 해당 수의 모든 비트가 반전되게 됩니다. 문제는 양수를 의미하는 '부호 비트'마저 반전되어 해당 수를 음수로 인식하게 되어버리는 것이죠.
때문에 컴퓨터는 반전된 해당 숫자를 2의 보수화된 음수로 인식하게 되고, 10진수로 출력하기 위해서는 원본 값을 찾기 위해 다시 2의 보수화 과정을 수행해주는 것입니다.
(참고로 2의 보수화된 수를 다시 2의 보수화하면 원래의 수로 돌아갑니다.
ex) 1010 -> 2의 보수화 -> 0110 -> 2의 보수화 -> 1010 )
행복한 하루되세요 :)
-
관리자2019-06-07 11:35:23
안녕하세요 길벗수험서 운영팀입니다.
먼저 하나를 가정해두셔야 합니다.
"컴퓨터에서는 음수를 2의 보수로 처리한다." 입니다.
not을 사용하게 되면 해당 수의 모든 비트가 반전되게 됩니다. 문제는 양수를 의미하는 '부호 비트'마저 반전되어 해당 수를 음수로 인식하게 되어버리는 것이죠.
때문에 컴퓨터는 반전된 해당 숫자를 2의 보수화된 음수로 인식하게 되고, 10진수로 출력하기 위해서는 원본 값을 찾기 위해 다시 2의 보수화 과정을 수행해주는 것입니다.
(참고로 2의 보수화된 수를 다시 2의 보수화하면 원래의 수로 돌아갑니다.
ex) 1010 -> 2의 보수화 -> 0110 -> 2의 보수화 -> 1010 )
행복한 하루되세요 :)
-
관리자2019-06-11 11:31:19
안녕하세요 길벗수험서 운영팀입니다.
음.. 뭔가 착각하고 계신 부분이 있으신 것 같습니다.
수를 처리하고 인식하는 과정을 컴퓨터와 사람으로 구분하셔서 이해하셔야 합니다.
컴퓨터가 음수를 처리할 때는 부호비트를 1로 교체한 후 본래 값을 2의 보수화 시킵니다.
사람이 -8을 컴퓨터에 입력한다면, 컴퓨터는 이것을
(이하 편의를 위해 8비트 처리, 맨 앞비트는 부호비트)
1111 1000 으로 저장합니다.
이것을 사람에게 다시 보여주라고 printf("%d") 로 출력한다면,
컴퓨터는 먼저 부호비트가 '1'임을 인식하여 해당 비트가 '음수'라는 것을 알고 2의 보수화 처리를 시작합니다.
0000 1000 이라는 값이 나왔고 음수였으니 이를 사람에게 출력할 때는
-8 이라는 값을 보여주겠죠.
----------------------
종종 이해를 위해 부호비트를 아예 열외하고 연산하는 경우도 있습니다.
8을 저장 시 동일하게 2의 보수화하여
'1' 111 1000 저장한 후, 출력할 때 부호비트를 제외한 비트만을 2의 보수화를 수행하여
'1' 000 1000 로 변환하여 뒤의 값만을 10진수로 출력한 후, 부호비트에 따라 음수(-) 또는 양수(+)를 표시하는 방법이죠.
두 방법 중 편한과정을 통해 결과를 도출하시면 되겠습니다.
행복한 하루되세요 :)
-
*2019-06-10 21:44:21
컴퓨터에서는 음수를 2의 보수로 처리한다는 것까지는 이해가 되었습니다.
f는 b를 반전시킨 값이기 때문에 1111...1000이 나오고 맨 앞에 부호비트가 바뀌어
음수로 인식하게 될 수 있어서 다시 한 번 2의 보수화 과정을 수행한다는 것도 알겠습니다.
2의 보수화를 취해서 0000....1000이 되었으니 정답은 8이아야 되는 거 아닌가요?
해설을 보니 원래 음수값이었기 때문에 -를 붙여서 -8이라는데 음수 안만들려고
2의 보수화를 취한 거 아니었나요?