컴공 일기252
한 번쯤은 생각해 볼 법한 예제라서 가져왔습니다. C를 한 번이라도 배워보셨던 분은 한번 풀어보셔도 괜찮아 보이네요.
int main()
{
unsigned int num1 = -1;
unsigned char num2 = -1;
printf(“%d %d”, num1, num2);
}
정답은 -1 255가 됩니다.
서식지정자 %d의 작동 메커니즘과 부호 비트에 관해 어느 정도 상세히 알아야 풀 수 있는 문제입니다.
unsigned int는 기본적으로 부호비트가 없는 32비트이고 부호화 2의 보수법에 의거해 2진수로 나타내면
num1 = 1111…11((32개)가 됩니다. 다시 말해 실질적으로 num1에 들어가는 값은 -1이 아닙니다.
-1을 부호화 2의 보수법에 의거해 2진수로 나타내면 1111….1(32개)인데, unsigned int라는 형에 의해 마지막 1이 부호비트로 해석되지 않아 2^32-1이 최종적인 값으로 num1에 대입됩니다.
마찬가지로 unsigned char는 8비트이므로 num2 = 111..1(8개) = 255가 되겠지요.
여기까지 생각한다면 결괏값은 2^32-1 255가 되어야 할 것 같지만, 함정이 하나 더 있습니다.
서식지정자 %d의 메카니즘.
%d라는 서식지정자는 32비트 2진수를 10진수(decimal)로 재해석해서 콘솔에 출력하라는 의미입니다.
그런데, 여기서 %d에서는 부호비트를 적용하게 되지요.
즉 1111…1(32개) = -1이 되어 출력됩니다.
그렇다면 8비트짜리는요? 32비트 10진수를 출력해야 하는데.. 24비트가 부족하게 되지요. 그렇다면 형식에 24비트를 채워야 합니다. 어떤 방식으로 채워야 할까요? 기존의 8비트짜리 변수가 음수라면 1을 채우고, 양수라면 0을 채웁니다.
111..1(8개) = 255이고, 이 자체가 양수로 평가되므로 %d 서식지정자에 의해 000…011111111이 num2에 해당하게 됩니다. 마지막 비트에 해당하는 부호비트가 0이므로, 255가 그대로 출력되게 됩니다.
아주 간단한 예제지만, 컴퓨터 구조를 꽤 정확하게 알고 있어야 도출할 수 있는 예제가 되겠군요.
0 XDK (+0)
유익한 글을 읽었다면 작성자에게 XDK를 선물하세요.
-
케이ㅋ.....엌ㅋㄲㅋ 케이크 엌ㄲ
-
대략 아이린 누나 트와이스 여자친구 아이오이이 그리고 우리 케이누나 이렇게 많이 보임 ㅎㅎ
-
꽃 케 이 ★ 18
그러하다
-
케이
-
케람차
-
케이 ★ 3
케이야 생일축하행
-
케이 ★ 10
오늘은 케이양의 생일이에요
-
케이 ★ 0
히히
-
케이 ★ 1
커옂
-
케이 ★ 1
케여워
-
케이 ★ 1
흐흐
-
케이 ★ 2
하안녕~
-
케이 ★ 2
안녕~~
-
케이 ★ 4
삼대 족발...
-
케무민 ★ 3
!?
-
케이 ★ 6
으앙
-
케이 ★ 0
히...
-
케이 ★ 7
어제처럼 굿나잇~
-
케이 ★ 11
귀여엉
-
케이 ★ 9
넘나 이쁜것..
-
케이 ★ 8
넘나 귀여운것...
-
케이 ★ 2
?
-
케이 ★ 3
넘나귀여운것
-
케이 ★ 5
뚠뚠
-
케이 ★ 0
아몰랑...
-
케이 ★ 1
넘나 이쁜것..
-
케이 ★ 2
넘나 귀여운것..
-
케이 ★ 12
넘나 귀여운것....
-
케이 ★ 14
넘나 귀여운것...
-
케이 ★ 1
넘나 좋은것...
-
케이 ★ 8
잘자용~
-
케이 ★ 6
넘나 귀여운것...
-
케이 ★ 4
넘나 귀여운것...
-
케이 ★ 1
잘자용
-
케이 ★ 6
넘나 귀여운것...
-
케이 ★ 2
넘나 귀여운것...
-
케빵떡 ★ 3
빵떡아니고 류블리~
-
케이 ★ 2
거리에 함께 나온 연인들~
-
케이 무민★ 6
넘나 이쁜것...
-
케이 ★ 8
너를 볼수없잖아~
-
케이 ★ 2
그대 사랑 한방울 떨어트리면 행복이 번져~
-
케이 ★ 1
심쿵사
-
케이 ★ 2
띠드버거
-
케이 ★ 7
어제처럼 굿나잇~
-
케이★ 8
잘자영
-
케이 ★ 8
이런 내맘 모를꺼야~
-
케이 ★ 2
넘나 귀여운것..
-
케이 ★ 3
아무리 그대 무뎌진다해도~
-
케이 ★ 10
매일 너의 목소리 습관보다 무서운데~
-
케이 ★ 4
넘나 귀여운것...
이런 공부는 무슨 책으로 어떻게 하면 될까요?
주로 컴퓨터구조 전공 서적이나, C 전공 서적을 참조하시면 공부할 수 있습니다. 추가적으로 여기에 사용되었던 부호화된 2의 보수법이나, 부호비트, 비트연산 같은 경우는 논리회로라는 과목으로도 충분히 커버할 수 있는 내용이지요. 한빛미디어에서 나온 <디지털 논리회로> 책을 한 번 일별해보시는 것도 추천드립니다.
양이 워낙 방대하긴 하지만, 쭉 읽다 보면 컴퓨터라는 게 어떤 방식으로 작동하게 되는지 개략적으로 알 수 있을 겁니다.
감사합니다!!
컴공주님 혹시 그 책 완독하셨나요? 방학때 전공 대비로 공부해보려 하는데, 혹시 읽어보셨다면 후기 적어주신다면 감사하겠습니다