~a 가 반전해서 1111 0000 인것은 알겠어요. (a = 15 이므로)
궁금한것은요
1. not 인데 왜 2의보수를 구해야 하는지
2.
1111 0000 의 2의보수는 0000 0001 이 아닌 0001 0000인지
3. 왜 마지막 16에 -를 붙이는지 (반전부호라서그런가요?)
안녕하세요 길벗수험서 운영팀입니다.
[1]
Java와 C에서 수치값을 저장할 때 맨 앞 비트는 부호비트로 사용하며, 음수는 2의 보수로 표현합니다.
Not(~)을 사용하는 경우 부호비트도 반전되기 때문에 음수로 전환되게 되버리죠.
결국 ~ 비트연산을 통해 음수가 되어버린 비트를 10진수로 표현하기 위해서는 2의 보수화를 하여 값을 구해야 합니다.
[2]
2의 보수화는 여러가지 방법이 있지만 그 중 하나는 not 수행(1의 보수화) 후, +1을 수행하면 됩니다.
1111 0000 에서 not 수행하면
0000 1111 이 되며, 여기서 +1을 수행하면
0001 0000 이 됩니다.
이진수 0001 0000은 10진수로 변환하게 되면 16이죠.
[3]
2의 보수의 목적을 생각하셔야 합니다.
해당 비트가 (-)음수임을 표현하기 위해 2의 보수로 표현한 것입니다.
때문에 재차 2의 보수를 수행하여 원래 값을 찾은 후, 해당 값에 음수 표시를 해 주어야 올바른 값이 됩니다.
(1010 -> 2의 보수화 -> 0110 -> 2의 보수화 -> 1010)
행복한 하루되세요 :)
-
관리자2019-05-09 10:36:03
안녕하세요 길벗수험서 운영팀입니다.
[1]
Java와 C에서 수치값을 저장할 때 맨 앞 비트는 부호비트로 사용하며, 음수는 2의 보수로 표현합니다.
Not(~)을 사용하는 경우 부호비트도 반전되기 때문에 음수로 전환되게 되버리죠.
결국 ~ 비트연산을 통해 음수가 되어버린 비트를 10진수로 표현하기 위해서는 2의 보수화를 하여 값을 구해야 합니다.
[2]
2의 보수화는 여러가지 방법이 있지만 그 중 하나는 not 수행(1의 보수화) 후, +1을 수행하면 됩니다.
1111 0000 에서 not 수행하면
0000 1111 이 되며, 여기서 +1을 수행하면
0001 0000 이 됩니다.
이진수 0001 0000은 10진수로 변환하게 되면 16이죠.
[3]
2의 보수의 목적을 생각하셔야 합니다.
해당 비트가 (-)음수임을 표현하기 위해 2의 보수로 표현한 것입니다.
때문에 재차 2의 보수를 수행하여 원래 값을 찾은 후, 해당 값에 음수 표시를 해 주어야 올바른 값이 됩니다.
(1010 -> 2의 보수화 -> 0110 -> 2의 보수화 -> 1010)
행복한 하루되세요 :)