Programming Language/C Language

[C] Study: 변수와 자료형 - (3) 정수형

gapsoo 2023. 8. 12. 19:06

 

 

 


[3] 정수형

 

 정수형은 가장 기본적인 자료형으로 정수를 저장할 수 있다.

 

 정수형에는 다음과 같은 자료형이 있다.

 

 

 정수형 변수는 -∞에서 +∞까지 표현하지 못함

 

 비트의 개수 때문에 표현하는 수의 범위에 제한이 있다.

 

 short형: 16비트로 정수 저장

 

 int, long형: 32비트

 

 long long형: 64비트

 

참고: 비트와 바이트

컴퓨터에서 사용하는 정보의 최소단위를 비트(bit0라고 한다. 컴퓨터에서는 이진수를 사용하고 비트는 이진수의 하나의 자릿수가 되어 0이거나 1일 수 있다. 8개의 비트가 모인 것이 바이트(byte)이다. 비트는 전자 스위치로 아주 간단하게 구현할 수 있다. 전기가 흐르면 1(on)이라고 생각하고 전기가 흐르지 않으면 0(off)으로 생각하면 되는 것이다.

 

참고

현재 자기가 사용하는 자료형이 나타낼 수 있는 범위가 얼마인지를 알고 싶으면 limits.h 헤더 파일을 참고하면 된다. 여기에는 정수형들의 최댓값과 최솟값을 기호 상수로 정의해 놓았다. 예를 들어서 int형의 최댓값은 INT_MAX로, 최솟값은 INT_MIN으로 알 수 있다.

 

Q 그렇다면 다양한 정수 타입 중에서 어떤 정수 타입을 사용하여야 하는가?
A 만약 상당히 큰 값(32,767이상 또는 -32,767이하)들을 필요로 한다면 long형을 사용하는 것이 좋다. 만약 기억 공간을 줄여야 한다면 short형을 사용하는 편이 유리하다. 일반적인 경우에는 int형을 사용한다. 만약 음수를 사용하지 않는다면 unsigned형을 사용하는 편이 좋다.

 

 

 


unsigned 수식자

 unsigned는 변수가 음수가 아닌 값만을 나타낸다는 것을 의미

 

 음수가 제외되면 같은 비트로 더 넓은 범위의 양수를 나타낼 수 있다는 장점이 있다.

 

 예를 들어

short -32768 ~ +32767
unsigned short 0 ~ 65535

 

unsigned를 붙이면 양수만 표현할 수 있다.

 

 몇 가지의 예를 아래에 보였다.

 

1
2
unsigned int speed; // 부호 없는 int형 변수 speed
unsigned speed;     // 이렇게 해도 된다.
cs

 

참고

unsigned라고만 쓰면 unsigned int형을 의미한다. 또한 short형은 short int라고 쓸 수도 있다. 마찬가지로 long형은
long int 라고 쓸 수도 있다.

 

 

 


오버플로우

 

 정수형 변수를 이용하여 산술 연산을 하는 경우, 산술 연산의 결과가 정수형이 나타낼 수 있는 범위를 넘어갈 수도 있다.

 

 오버플로우(overflow): 변수가 나타낼 수 있는 범위를 넘는 숫자를 저장하려고 할 때 발생한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <limits.h>
int main(void)
{
    short s_money = SHRT_MAX;// 최대값으로 초기화한다.
    unsigned short u_money = USHRT_MAX; // 최대값으로 초기화한다.
 
    printf("s_money = %d\n", s_money);
    printf("u_money = %d\n", u_money);
 
    s_money = s_money + 1;
    printf("s_money = %d\n", s_money);
    u_money = u_money + 1;
    printf("u_money = %d\n", u_money);
 
    return 0;
}
cs

 

 

 

 변수의 값이 변수가 저장할 수 있는 한계를 벗어나면 자동차의 주행 거리계처럼 다시 처음으로 돌아가서 시작한다.

 정수형에서 오버플로우가 발생하더라도 컴파일러는 아무런 경고를 하지 않는다. 따라서 프로그래머가 정수형을 사용할 때는 오버플로우가 일어나지 않도록 주의하여야 한다.

 

 

 


입출력 형식 지정자

 

printf() 함수나 scanf() 함수에서 정수형을 입출력하는 형식 지정자는 다음과 같다.

 

자료형 형식 지정자 설명
short %hi 입력할 때는 %hi를 사용하는 것이 좋다, 출력시에는 %d도 가능하다.
int %d x
long %ld x
long long %lld 특히 입력할 때는 반드시 %lld를 사용하여야 한다. 출력 시에도 %lld를 사용하여야 한다.

 

 

 


정수형 상수

 

 정수 상수는 12나 100과 같이 프로그램 안에 직접 입력하면 된다.

 

 정수 상수는 기본적으로 int형으로 간주된다.

 

 만약 상수의 자료형을 프로그래머가 지정하고 싶은 경우는 접미사를 붙인다.

 

 123L처럼 정수 상수 뒤에 접미사로 L을 붙이면 123이라는 상수를 long형(32비트)으로 간주한다.

 

 

[정수 상수]

접미사 자료형
u 또는 U unsigned int 123u 또는 123U
l 또는  L long 123l 또는 123L
ul 또는 UL unsigned long 123ul 또는 123UL

 

 정수 상수는 10진법뿐만 아니라 8진법이나 16진법으로도 표기가 가능하다.

 

 정수 상수를 8진법으로 표기하려면 앞에 0을 붙이면 된다. 

 

 16진법으로 정수 상수를 표기하려면 앞에 0x를 붙이면 된다.

 

 16진법은 0에서 9까지의 10개의 숫자와 A, B, C, D, E, F까지 6개의 문자를 추가하여 수를 표현하는 방법이다.

 

 예를 들어서 41719를 16진수로 나타내보면 0xA2F7이 된다.

 

 

 

  수를 나타내는데 A와 B와 같은 문자를 사용하는 것이 처음에는 생소해보일 것이다. 하지만 하드웨어 관련하여 비트 조작을 할 때는 10진법보다 16진법이 훨씬 사용하기가 편리하다.

 

 2진수와 16진수는 상당한 관련이 있다. 16진수에서 하나의 자릿수는 4비트에 해당한다. 따라서 0과 1로 되어 있는 데이터를 16진수로 표기하게 되면 알아보기가 쉽다.

 

0x0f(16진수) ↔ 0000 1111(2진수)

 

 

 다음 프로그램은 정수 상수 128을 10진수, 16진수, 8진수로 출력해본 것이다.

 

1
2
3
4
5
6
7
#include <stdio.h>
 
int main(void)
{
    printf("%d %#x %#o \n"128128128);
    return 0;
}
cs

 

 

 

 정수형의 값을 출력하거나 입력하려면 형식 지정자로 "%d"를 사용한다.

 

 8진수나 16진법으로 정수를 출력할 때 사용하는 형식지정자: "%#o", "%#x"를 사용한다.

 

 

 


기호 상수(#define 이용)

 보통의 상수에는 변수와는 달리 이름이 없다. 그러나 상수에도 이름을 붙일 수 있는 방법이 있다.

 

 기호 상수(symbolic constant)는 기호에 의하여 상수를 표현한 것이다. 

 

 이름 없는 상수는 리터럴 상수(literal)라고 한다. 예를 들어서 현재의 환율 1120을 기호 상수 EXCHANGE_RATE로 표현해보자.

#define EXCHANGE_RATE	1120

 

 보통 #define 문장은 프로그램의 맨 첫 부분에 모여 있다. #define이 들어가는 문장은 전처리기(preprocessor)가 처리한다. 전처리기는 코드에서 EXCHANGE_RATE를 전부 찾아서 1120으로 바꾼다.

 

 

 기호 상수는 상수 값을 그대로 쓰는 방법(리터럴 상수)에 비하여 몇 가지의 장점을 지닌다.

 

1. 기호 상수를 이용하면 프로그램을 읽기가 쉬워진다.: 아래의 문장 (1)에서는 1120이 무엇을 의미하는지 쉽게 알 수 없다. 그러나 문장 (2)에서는 환율이라는 것을 쉽게 알 수 있다.

 

won = 1120 * dollar;            // (1) 실제의 값을 사용
won = EXCHANGE_RATE * dollar;   // (2) 기호상수 사용

 

2. 프로그램이 동일한 상수를 여러 곳에서 사용하고 있는 경우에, 상수 값의 변경을 쉽게 할 수 있다는 것이다. 위의 예에서 환율이 1050으로 변경되었다고 가정하자. 만약 숫자를 사용했다면 프로그램에서 그 숫자가 사용된 모든 곳을 찾아서 값을 변경하여야 한다, 그러나 기호 상수를 사용했다면 기호 상수의 정의만 변경하면 된다.

 

 

리터럴 상수와 기호 상수의 비교

 

 

 


기호 상수(const 이용)

 

 기호 상수를 만드는 또 하나의 방법이 있다. 변수 선언 앞에 const를 붙이면 상수가 된다.

 

 const는 "constant"의 약자로서 변경되지 않는다는 의미이다.

 

const int EXCHANGE_RATE = 1120;

 

 위의 코드에서 EXCHANGE_RATE는 상수로서 1120을 나타낸다. const로 선언된 변수는 딱 한 번만 값을 저장할 수 있다.