컴공 일기253
한 번쯤은 생각해 볼 법한 예제라서 가져왔습니다. 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를 선물하세요.
-
으아아악
-
그냥 26수능으로 sky를 가야겠다 마음먹어
-
제자야 기상해라 0
학원가야지 에휴
-
자야지 1
-
키 160이하면서 키큰남자좋아하는 여자 얼굴 안되니 몸매부각해서 어필하면서 자긴 존잘만나려는 여자
-
ㅈㄴ 간절함
-
ㅋㅋ
-
게임을안하니까 1
인생이꽤쾌적하네
-
진짜 찐찐 잠 0
ㅈ
-
쿠팡.. 시간빨리갔으면좋게ㅛ다..
-
얼버기 0
암튼 기상임 암튼그럼 씻고잇올감
-
엄마한테 재수할동안 교정이나해달라고할까
-
잘자 3
바이
-
개꿀잼메타돌앗나보네
-
대답.
-
등장 1
-
그의 유지를 잇기로 했어요 그래서 이름을 바꿈 앞으로 전 개쩌는 아카네 리제입니다
-
안지는 사람? 6
일어난 사람을 찾아야 하나?
-
확백하고싶다
-
나 아직 안잔다 1
그냥 그렇다고
-
26명 모집 92명 지원 점공 29/42 허허...
-
진짜 잠.... 2
에효이....한명이 갔네.....
-
나군 외대 LD 쓰려다 카드 결제 오류로 원서 못 써서 울며 겨자먹기로 성대 썼는데...
-
저 사실 적백 6
내전
-
387은 짜피 써도 가망없엇겟져?
-
한명 가니까 또 가려하네....나도 갈까
-
너무적적해여 0
-
저도 걍 갈께요 6
ㅂㅂ
-
ㅈ됐다 뭔 6시 1
시잘 언제자노
-
원래 그냥 깨어있는 김에 오르비를 했는데 오늘은 뭔가 작년느낌이.. 오르비 재밌어서...
-
자다가 후다닥 왔습니다... 조의를 표해주십시오...
-
크아악 7
숙취 으아아
-
왜 지거국 토목 썼지 ㅆㅂ
-
꼭 합격하고 싶은 1지망 학교라서 그런데 발뻗잠 해도 되겠죠..? 점공한 사람...
-
돌아줬으면 좋겠다 ㅎㅎ
-
운동간다 1
-
메뉴는 아라비아딱 파스타임
-
ㅂㅂ 11
-
나도 잔다 4
Good Night
-
얼마나 하심? 사실 남자들 친해지는데에 운동 게임만한게 없긴한데
-
진짜 잔다 0
이제 4시간 자도 지각이다 ㅂㅂ
-
무휴반을 해야하나..아님 6월 공군가서 해야하나 고민이다
-
아주대vs과기대 2
둘다 붙을거같은데 어디가야됨?? 전에 한번 올리긴했는데 마지막으로
-
콩나물없어서 아쉽
-
지방 6등급대 사립대 인문->지거국 공대 왜 인서울 못함 ㅆㅃ이
-
뭘 올려도 어떻게든 맞히는 사람이 반드시 나온다.. 분명 나는 그게 어딘데 십덕아...
-
진지하게 내식이라 수능 끝나서 그이를 못보는게 가슴이 찢어짐
-
오르비를 발바닥공화국으로 만들려했다가 메인 가자마자 블라먹고 관리자한테 혼남...
-
질문안해주면 엉덩이 만짐
이런 공부는 무슨 책으로 어떻게 하면 될까요?
주로 컴퓨터구조 전공 서적이나, C 전공 서적을 참조하시면 공부할 수 있습니다. 추가적으로 여기에 사용되었던 부호화된 2의 보수법이나, 부호비트, 비트연산 같은 경우는 논리회로라는 과목으로도 충분히 커버할 수 있는 내용이지요. 한빛미디어에서 나온 <디지털 논리회로> 책을 한 번 일별해보시는 것도 추천드립니다.
양이 워낙 방대하긴 하지만, 쭉 읽다 보면 컴퓨터라는 게 어떤 방식으로 작동하게 되는지 개략적으로 알 수 있을 겁니다.
감사합니다!!
컴공주님 혹시 그 책 완독하셨나요? 방학때 전공 대비로 공부해보려 하는데, 혹시 읽어보셨다면 후기 적어주신다면 감사하겠습니다
문제가 워낙 방대해서 문제를 다 풀진 않았습니다만, 내용 같은 경우는 완독했습니다. 다름이 아니라, 수업에서 채택한 교재였어서 아무래도 디테일하게 읽을 수밖에 없었죠.
다만, 시험이 아닌 공부적 관점에서는 헷갈리거나 모르는 것들 위주로 발췌독하는 것이 좋을 듯 합니다. 논리회로 특성 상, 컴퓨터 구조와 연관성이 아주 긴밀하기 때문에 컴구에서 회로적 관점에서 헷갈리는 부분이 있을 때 자주 발췌해서 봤죠.