컴공 일기253
게시글 주소: https://orbi.kr/00070242684
한 번쯤은 생각해 볼 법한 예제라서 가져왔습니다. 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를 선물하세요.
-
얼버기 2
-
퇴근까지 세시간 1
좀만버티자
-
장수생들 보면 2
사법고시시절 고시낭인생각남 아니 너무 양상이 비슷해 메디컬고시 ㅇㅇ
-
X 보니까 전세계적으로 MS 계정 다 로그인이 안 된다네 초딩 때부터 쓰던 계정인데...
-
아픈가
-
얼버기 6
반갑습니다
-
선착순 1명 5
선착순 1명
-
알바 오늘이 마지막이였는데 그만둔다고 송별회 해주심 좋은 기억만 안고 갑니다
-
앞으로 어케될라나. 진짜 법제화로 얻어내는거 말고는 다 흐지부지일텐데... 일단 내...
-
와다다 와다다 2
달려
-
ㅁㄹㅋㅁㄴ 0
1일차
-
얼버기 6
눈이 저절로 감겨버렸음
-
히히 밤샜다 8
오겜 재밌어
-
기차지나간당 17
부지런행
-
힘내라 샤미코
-
미적분 선택이고 25수능에서 21 22 30 틀려서 88점 받았습니다. 반수 슬슬...
-
그저 네가 편안할뿐~ 너를 조금도 남자로 느껴본 적 없어~
-
자려고누우닠가 답없네
-
작년 봄부터 공군 떡상했는데 공군 떨한 사람들이 슬슬 육군 기술행정병 몰리는듯...
-
아. 1
으ㅡ르ㅡㅡ를
-
무수한 좋아요 요청
-
지금보기엔 너무 무서움 6시쯤 봐야 딱 야무짐
-
피곤해 0
자고 싶다
-
원래 미리 걱정하는거 안하는데올해는 그냥 여러가지 싸움날꺼 생각하면 짜증이 난다.안...
-
오노추 0
3월엔 3월의 판타시아 제목 : 청춘따위필요없어
-
상상친구임
-
자방의는 다 인설의 하려고 반수하고 휴학하고 기숙재종 들어간사람도 많고 빈익빈...
-
나는 쓸모 없어 2
개못해
-
친구 정병걸림 7
그 카톡에 # 이 기능으로, 웬 이상한거 존나 보내고 (걔네끼리 연관성도 ㅈㄴ...
-
하나 둘 2개랑 잡다한거 몇개 더 봣엇나, 기억 안 남뇨.+수능 얘기 하다 옴
-
문디컬 말고 ㅇㅇ 5명 내외?
-
많은것 같진 않은애매하게 열받는 애매한 재능없는것보단 낫것지
-
냠냠 0
-
이것조차 잘 모다네 3일 연속도 모다는 듯.루틴이 잇는 생활이 아ㅜㅈ 어렵다
-
이럴 땐 어떤 공부를 ㅐㅎ야만할까
-
는 생각이 항상 내 뇌에 어느정도는 차지하고 있는 거 같네
-
키우고 싶다.거북이도 키우고 싶다
-
빅스비틀고 아무말도 안했는데 갑자기 "5시간 후에 알람 맞춰줘" 라고 내 말풍선에...
-
고민이 많다
-
진챠로
-
잘자요 0
지금까지의 노력이 헛되지 않도록... 내일은 더 열심히!!
-
에무리
-
으하하하 0
-
벨기에의 독일어권 지역이라는 나름 체급 있는 문제여서 오답률 50%는 나왔지만...
-
뭔가 막 엄청 친해진 사람은 많이 없는듯한 느낌적인 느낌이 있음 ㅠㅠ 대충 이런...
-
사설 인강 들으려면 알바까지 해야할 거 같은데 일주일에 하루는 쉬어야 할 거 같고,...
-
힘든데 잠이안오네;;
이런 공부는 무슨 책으로 어떻게 하면 될까요?
주로 컴퓨터구조 전공 서적이나, C 전공 서적을 참조하시면 공부할 수 있습니다. 추가적으로 여기에 사용되었던 부호화된 2의 보수법이나, 부호비트, 비트연산 같은 경우는 논리회로라는 과목으로도 충분히 커버할 수 있는 내용이지요. 한빛미디어에서 나온 <디지털 논리회로> 책을 한 번 일별해보시는 것도 추천드립니다.
양이 워낙 방대하긴 하지만, 쭉 읽다 보면 컴퓨터라는 게 어떤 방식으로 작동하게 되는지 개략적으로 알 수 있을 겁니다.
감사합니다!!
컴공주님 혹시 그 책 완독하셨나요? 방학때 전공 대비로 공부해보려 하는데, 혹시 읽어보셨다면 후기 적어주신다면 감사하겠습니다
문제가 워낙 방대해서 문제를 다 풀진 않았습니다만, 내용 같은 경우는 완독했습니다. 다름이 아니라, 수업에서 채택한 교재였어서 아무래도 디테일하게 읽을 수밖에 없었죠.
다만, 시험이 아닌 공부적 관점에서는 헷갈리거나 모르는 것들 위주로 발췌독하는 것이 좋을 듯 합니다. 논리회로 특성 상, 컴퓨터 구조와 연관성이 아주 긴밀하기 때문에 컴구에서 회로적 관점에서 헷갈리는 부분이 있을 때 자주 발췌해서 봤죠.