전자계산기조직응용기사/필기 기출문제 해설

[문제해설] C 언어에서 x의 연산 결과는?

FISHBONE 2021. 8. 21. 21:12
반응형

전자계산기조직응용기사 필기 기출문제 (1과목 전자계산기프로그래밍-C언어)


C 언어에서 x의 연산 결과는?

#include stdio.h
int main( ) {
    unsigned char x7;
    xx<<8;
    printf("%d", x);
    return 0;
}

 0           56

192       256


 

- 문제 해설 -

반복문이나 분기문도 없는 단순한 알고리즘의 C언어 코드 문제이지만, 코드의 이해와 시프트 연산을 알고 있어야 정확히 풀 수 있는 문제입니다. 

코드를 살펴보겠습니다.

1 #include <stdio.h>
2 int main( ) {
3     unsigned char x=7;
4     x=x<<8;
5     printf("%d", x);
6     return 0;
7 }

3번 라인 : unsigned char 자료형으로 변수 x를 선언하며 정수 7로 초기화합니다.

먼저 C언어 자료형들의 signed와 unsigned에 대해 먼저 설명하겠습니다.

기본적이라서 생략 가능한 signed는 부호를 사용한다는 말입니다.

int a;

위 코드는 우리가 일반적으로 사용하는 정수형 변수를 선언한다는 의미입니다. 이 코드는

signed int a;

이렇게 써도 됩니다. 흔히들 signed는 생략해서 사용합니다.

이와 반대로 unsigned는 부호를 사용하지 않는 것입니다.

unsigned int a;

이와 같이 코딩하면 부호를 사용하겠다는 말입니다.

지금까지 이야기하고 있는 부호는 당연히 +,-, 즉 양수와 음수를 말하고 있습니다.

그럼 signed형과 unsigned를 비교해보겠습니다. 어떤 정수 자료형이 4 비트라고 가정해보면 코드표는 다음과 같습니다.

2진수 signed unsigned
0000 0 0
0001 1 1
0010 2 2
0011 3 3
0100 4 4
0101 5 5
0110 6 6
0111 7 7
1000 -8 8
1001 -7 9
1010 -6 10
1011 -5 11
1100 -4 12
1101 -3 13
1110 -2 14
1111 -1 15

위 표는 논리회로를 공부하셨다면, 상당히 익숙하실 겁니다. signed형의 경우 부호화된 2의 보수 코드라는 것을 아셔야 됩니다.

unsigned형을 사용하는 부호가 필요 없을 시 절댓값의 표현 범위가 2배 정도로 커지기 때문입니다.

그리고 char형은(signed, unsigned 둘 다) 그 크기가 1byte입니다.

char형의 크기는 1byte

그럼 3번 라인이 실행되면 8bit(1byte)의 메모리가 확보되며, 초기값 7이 다음과 같이 저장됩니다.

0 0 0 0 0 1 1 1

 

4번 라인 : '<<'는 왼쪽 비트 이동 연산자, 즉 레프트 쉬프트(left shift) 연산을 수행합니다. 참고로 '>>'는 오른쪽 비트 이동 연산자입니다.

'x=x<<8;'는 비트들이 왼쪽으로 전부 옮겨지면서, 빈칸에는 모두 0으로 채우는 동작을 0번 수행합니다. 그러면 결과는 아래와 같이 모두 0으로 채워지게 됩니다.

0 0 0 0 0 0 0 0

 

5번 라인 : 그냥 변수 x의 값을 정수형으로 출력하는 명령어입니다. 4번 라인에서 비트 이동한 후 값은 0이니, 출력 값은 당연히 0이 됩니다.

 

정답은 1번입니다.

 

어려운 문제는 아니나,  C언어 자료형들의 코드와 부호화된 2의 보수를 연관하여 공부하시길 바랍니다.

 

 

 

https://youtube.com/playlist?list=PLboXycXmAIDuukQ2A6EvMZI-x1IMy3Xc-

 

전자계산기조직응용기사 필기

국가기술자격증 '전자계산기조직응용기사' 필기 강의

www.youtube.com

 

반응형