[C 언어의 기초] 데이터형과 선언 - 2부







형 선언



C 프로그램을 작성할 때에 귀찮게 생각되는 것은, 사용되는 모든 변수의 형을 선언해야만 하는 것이다. 변수의 형 선언은 앞에서 표시한 형 선언자(char, int 등)를 사용해서 프로그램의 선두에서 (모든 실행문에 선행하여) 다음과 같이 선언되어야 한다. 

main( )
int a, sum; 
char code; 

선언하는 변수의 형이 같은 것은 콤마(,)로 분류하여 나열하는 것이 일반적이지만,

int a; 
int sum;

와 같이 별도로 써도 상관없다. 

C 언어를 처음 공부하는 사람들이 잘 틀리는 것은

int a; 
a=0; int sum; 

라고 표현하는 것이다. 

이것은 실행문 a=0; 가 선언문 int sum; 보다 먼저 작성 되었기 때문에 에러가 발생한 것이다.

C 언어에서 문자형과 정수형은 모두 정수로 기억된다. 다만, 문자형은 1 byte로 표현되고 정수형은 2 bytes(or 4 bytes)로 표현될 뿐이다.

확인 문제 1
/* 두개의 정수를 int형과 short형으로 읽어 각각 출력 한다 */
#include<stdio.h>
main()
{
short s;
int n;
printf("Input two integers: ");
scanf("%hd%d", &s, &n);

/*short형 데이타를 short와 int로 출력 */
printf("dec = %hd, octal=%ho, hexa = %hx\n", s, s, s);
printf("dec = %d, octal=%o, hexa = %x\n\n", s, s, s);

/*int형 데이타를 int와 short로 출력 */
printf("dec = %d, octal=%o, hexa = %x\n", n, n, n);
printf("dec = %hd, octal=%ho, hexa = %hx\n", n, n, n);
}

확인 문제 2
/* long형 변수의 10진, 8진, 16진수 입출력 프로그램 */
#include<stdio.h>
main()
{
long l_in;
printf("Input long integer: ");
scanf("%ld", &l_in);
printf("dec = %ld, octal = %lo, hexa = %lx\n", l_in, l_in, l_in);
}

확인 문제 3
/* 정수 -1의 int형과 unsigned형의 10진수,8진수, 16진수의 출력 */
#include<stdio.h>
main()
{
int data = -1;
unsigned u = 0xffff;
printf("int:%d %x %o %u \n", data, data, data, data);
printf("unsigned:%d%x%o%u\n", u, u, u, u);
}

확인 문제 3의 실행 결과는 터보 씨의 경우, 다음과 같습니다.

int : -1 ffff 177777 65535
unsigned : -1ffff17777765535

출력 결과에서 보는 바와 같이 int 형의 -1과 unsigned 형의 0xffff의 10진수, 8진수, 16진수의 실행 결과는 동일합니다. 따라서 unsigned short와 unsigned long의 8진 수 또는 16진수의 입/출력지정자는 %ho와 %hx, %lo와 %lx를 사용하면 됩니다. 


또 int 형 변수 data에 -1을 초기화한다음에 이를 %d로 출력할 때는 정상적으로 출력 되지만 %u로 출력할 때는 부호 비트도 데이터로 취급하므로 65535를 출력하게 되며, unsigned 형 변수 u에 초기화된 0xffff는 부호 없는 10진수로 65535가 되지만 %d로 출력하면 최상위 비트를 부호 비트로 사용하므로 -1로 출력하게 됩니다. 

즉, 기억 장소에 저장되는 모든 수는 2진수로 저장되며, -1을 unsigned 형에 할당하면 C 컴파일러는 이를 65535로 할당하므로 이들이 입/출력될 때 어떤 입/출력 지정자를 사용하느냐에 따라 출력을 다르게 한다는 것입니다. 그러므로 변경자 unsigned를 사용하여 선언된 변수에 음수값을 할당할 수 있으며, 입/출력에도 아무런 문제가 발생하지 않습니다.






Reactions

댓글 쓰기

0 댓글