Data type expression method in C (2/2)
데이터 타입 표현 방법, 정수 & 실수 & 문자 표현 방법

Contents
1️⃣ 정수 표현 방법 (interger expression)
2️⃣ 실수 표현 방법 (float expression)
3️⃣ 문자 표현 방법 (Character expression)
1️⃣ 정수 표현 방법 (interger Representation)
정수 표현 방법(Integer Representation)

컴퓨터에서 정수는 이진수 형태로 표현되고 이진수는 전자 스위치로 표현된다.
Short 형(Short type)

C 언어에서 short형은 정수형 자료형 중에서 작은 범위의 정수를 표현할 때 사용하는 자료형이다. short는 2바이트(16비트) 크기를 가지며, 일반적인 int 자료형보다 표현할 수 있는 값의 범위가 작다. 보통 메모리 사용량을 줄이거나, 큰 값이 필요 없는 경우에 short형을 사용한다.
1. short형의 정의와 특징
정의: short는 정수를 저장할 수 있는 기본 정수형 자료형 중 하나로, short int 또는 간단히 short라고 표현할 수 있다.
크기:
short는 일반적으로 2바이트(16비트)의 메모리를 차지한다. 컴파일러와 시스템에 따라 크기가 다를 수 있지만, 대부분의 경우 2바이트로 구현된다.값의 범위:
부호가 있는
short형 (signed short): -32,768 ~ 32,767부호가 없는
short형 (unsigned short): 0 ~ 65,535
표현 방식:
short형의 경우 음수를 표현하기 위해 2의 보수 방식을 사용한다.기본적으로
signed short가 사용되며, 명시적으로 부호를 지정하지 않아도 음수와 양수 값을 모두 표현할 수 있다.
음수를 표현하는 첫번째 방법 (The First Method to Represent Negative Numbers)
정수 표현 방법에서는 양수와 음수를 다르게 표현해야 한다. 컴퓨터에서 정수를 저장할 때, 양수는 간단히 이진수로 변환(십진수 → 이진수)하여 저장할 수 있지만, 음수를 표현할 때는 추가적인 방법이 필요하다. 이때 음수를 표현하기 위해 사용하는 대표적인 방법이 부호 비트(Sign Bit)와 보수(Complement)를 사용하는 방법이다. 부호 비트 방법 먼저 알아보자.
1. 정수의 양수 표현(Positive Representation of Integer)
양수는 십진수 값을 이진수(Binary)로 변환하여 간단히 저장할 수 있다.
예를 들어, 10진수 5는 이진수로 101입니다. 컴퓨터에서는 이를
0000 0101(8비트로 표현)로 저장한다.양수는 가장 왼쪽 비트(최상위 비트)가 항상 0으로 설정된다.
예제: 10진수 5의 이진수 표현 (8비트)
10진수 5를 2진수로 변환:
1018비트로 맞추기 위해 앞에 0을 추가:
0000 0101
컴퓨터 메모리에서는 위와 같은 형태로 저장된다.
2. 정수의 음수 표현 (Negative Representation of Integer)
음수를 표현할 때는 부호 비트와 보수 개념을 사용하여 표현해야 한다. 일반적으로 첫 번째 비트(가장 왼쪽 비트)를 부호 비트(Sign Bit)로 사용하여 양수와 음수를 구분한다.
부호 비트:
0: 양수를 나타냄.
1: 음수를 나타냄.
덧붙여서 음수는 양수와는 달리 보수 표현 방식을 사용합니다. 이를 통해 음수와 양수를 더할 때 일관된 연산 결과를 얻을 수 있다.
음수 표현 방법
부호-절대값(Sign-Magnitude) 표현:
첫 번째 비트로 부호를 나타내고, 나머지 비트로 숫자의 절대값을 나타낸다.
예:
-5를 8비트로 표현하면1000 0101문제점: 덧셈과 뺄셈 연산에서 복잡도가 증가하고, 양수 0과 음수 0이 별도로 존재하여 비효율적이다.
컴퓨터는 덧셈만 할 수 있다(Computers can only perform addition)

퓨터에서 연산을 처리할 때, 덧셈만으로 모든 산술 연산을 처리할 수 있도록 설계된 이유는 회로의 복잡성을 줄이고 효율성을 높이기 위해서이다. 이 개념은 하드웨어 설계와 컴퓨터 구조에서 중요한 역할을 하며, 컴퓨터가 어떻게 덧셈 회로만을 사용해 뺄셈과 같은 연산을 수행하는지에 대한 설명은 다음과 같다.
컴퓨터 내부의 연산은 논리 회로(logic circuits)를 통해 이루어진다. 덧셈, 뺄셈, 곱셈, 나눗셈 등의 연산을 모두 처리할 수 있는 회로를 각각 별도로 만들면 회로의 복잡도가 증가하고, 크기와 비용도 커진다. 따라서 덧셈만으로 뺄셈을 처리할 수 있는 방식을 사용하여 회로를 단순화하고 효율성을 높일수 있다.
- 덧셈 회로는 뺄셈 회로에 비해 더 간단하고, 덧셈만으로도 뺄셈을 수행할 수 있는 방법이 있기 때문에 컴퓨터는 덧셈 회로만을 사용하여 모든 연산을 처리하도록 설계되었다.
음수를 표현하는 두번째 방법(The second method to represent negative numbers)
2의 보수는 컴퓨터에서 음수를 표현할 때 가장 표준적인 방법으로 사용되며, 덧셈 연산을 통해 뺄셈을 수행할 수 있는 장점이 있다. 아래에서는 2의 보수를 만드는 방법과 그 과정에 대해 살펴보자
2의 보수(Two’s complement)
1. 2의 보수로 음수를 표현하는 방법
2의 보수를 사용하면 양수와 음수를 같은 방식의 덧셈 연산으로 처리할 수 있다. 이는 컴퓨터에서 음수와 양수의 연산을 단순화하고, 효율적으로 수행할 수 있도록 하기 때문에 널리 사용된다.
2의 보수를 만드는 방법
2의 보수를 만드는 과정은 두 단계로 이루어진다.
1의 보수를 구한다:
1의 보수는 주어진 이진수의 각 비트를 반전하여(1을 0으로, 0을 1로) 구한다.
예: 10진수 +3을 8비트 이진수로 표현하면
0000 0011이다. 이 값을 1의 보수로 변환하면1111 1100이 된다.
1의 보수에 1을 더한다:
1의 보수로 변환한 값에 1을 더하면 2의 보수가 됩니다.
예:
1111 1100(1의 보수) +1=1111 1101(2의 보수).
이 값은 10진수로 -3을 의미하는 2의 보수 표현입니다.
2. 2의 보수를 구하는 단계별 예제
예제: 10진수 -3의 2의 보수 구하기 (8비트 표현)
3의 이진수 표현:
- 10진수 3을 8비트 이진수로 변환하면
0000 0011이다.
- 10진수 3을 8비트 이진수로 변환하면
1의 보수 구하기:
각 비트를 반전한다:
0000 0011→1111 11001의 보수는 양수의 각 비트를 반전시켜 얻는 값이다.
1의 보수에 1을 더하여 2의 보수 구하기:
1111 1100+ 1 =1111 1101최종적으로
1111 1101은 10진수 -3을 의미하는 2의 보수이다.
3. 2의 보수를 사용하는 이유
2의 보수를 사용하면 다음과 같은 장점이 있다.
덧셈 연산만으로 음수와 양수를 계산할 수 있다:
- 2의 보수를 사용하면, 음수와 양수의 덧셈을 통해 뺄셈을 수행할 수 있다. 예를 들어,
7 - 3을7 + (-3)으로 변환하여 계산할 수 있다.
- 2의 보수를 사용하면, 음수와 양수의 덧셈을 통해 뺄셈을 수행할 수 있다. 예를 들어,
0의 표현이 단 하나만 존재한다:
- 1의 보수나 부호-절대값 표현에서는 양수 0과 음수 0이 각각 존재하나, 2의 보수에서는
0000 0000이 유일한 0의 표현이다.
- 1의 보수나 부호-절대값 표현에서는 양수 0과 음수 0이 각각 존재하나, 2의 보수에서는
덧셈 연산의 일관성:
- 덧셈 회로에서 양수와 음수 모두 동일한 연산을 수행할 수 있으므로, 하드웨어 설계가 단순해지고 연산 속도가 빨라진다.

2의 보수로 양수와 음수를 더하면(Adding positive and negative numbers using Two’s complement)
예제: 10진수 3과 -3을 더하여 0이 되는지 확인
3의 이진수:
0000 0011-3의 2의 보수:
1111 1101덧셈 연산:
0000 0011+1111 1101=0000 0000(10진수 0)
결과: 양수와 음수를 더하여 0이 되는 것을 확인할 수 있다.
예제

2️⃣ 실수 표현 방법 (float expression)
실수를 나타내는 방법 (Method of representing real numbers)

실수를 나타내는 방법 수학에서의 실수는 3.14와 같이 소수점을 가진 수이다. 실수는 매우 큰 수나 매우 작은 수를 다루는 과학이나 공학 분야의 응용 프로그램을 작성할 때는 없어서는 안 될 중요한 요소이다.
아래에 언급될 고정 소수점 방식은 단순한 구조와 빠른 연산 속도를 제공하지만, 범위 제한과 정밀도 손실이라는 문제로 인해 매우 큰 수나 매우 작은 수를 다루는 과학 및 공학 분야에서는 잘 사용되지 않는다. 대신, 이러한 분야에서는 부동 소수점 방식이 더 자주 사용된다.
실수를 표현하는 방법 #1 (Method of expressing real numbers)
고정 소수점 방식: Fixed-point representation
고정 소수점 방식에서는 정수 부분과 소수 부분을 각각 일정한 비트 수로 나누어 표현한다. 예를 들어, 총 32비트로 실수를 표현할 때 정수 부분에 16비트, 소수 부분에 16비트를 할당하는 경우이다.

고정 소수점 방식의 동작 방식
정수 부분 (interger)
정수 부분을 표현하기 위해 비트 수의 절반 또는 일부를 할당한다.
예를 들어, 32비트 중 정수 부분에 16비트를 할당하면, 정수 부분은 최대 2^16-1 (65,535)까지 표현할 수 있다.
소수 부분 (float)
소수 부분을 표현하기 위해 남은 비트를 할당한다.
예를 들어, 32비트 중 소수 부분에 16비트를 할당하면, 소수점 이하의 값을 2^-1, 2^-2, 2^-3, ..., 2^-16의 비율로 세밀하게 표현할 수 있다.
고정 소수점 방식의 장, 단점
장점
연산 속도가 빠름:
- 고정 소수점 방식은 정수 연산을 기반으로 하므로, 덧셈 및 뺄셈과 같은 연산을 빠르게 수행할 수 있다.
단순한 구현:
- 정수와 소수 부분을 미리 정해두기 때문에 하드웨어 구현이 단순하며, 메모리에서 비트 간의 연산도 쉽게 수행할 수 있다.
단점
표현 가능한 값의 범위가 제한적:
- 정수 부분과 소수 부분의 비트 수를 고정하여 사용하기 때문에 아주 큰 값이나 아주 작은 값을 표현할 수 없다. 예를 들어, 과학 및 공학 분야에서 사용되는 매우 큰 수(예: 1.23 × 10^30)나 매우 작은 수(예: 1.23 × 10^-30)를 표현하기 어렵다.
정밀도 손실:
- 정수와 소수 부분에 할당된 비트 수가 한정되어 있어, 소수점 이하의 값에서 정밀도 손실이 발생할 수 있다. 예를 들어, 소수 부분에 16비트를 할당하더라도, 더 세밀한 값을 표현하려면 비트 수가 부족해 정확한 값을 나타내지 못할 수 있다.
실수를 표현하는 방법 #2 (Method of expressing real numbers)
대안: 부동 소수점 방식 (Floating-Point Representation)

이러한 문제점을 해결하기 위해 부동 소수점 방식이 고안되었다.
부동 소수점 방식은 고정 소수점 방식의 한계를 극복하여 더 넓은 범위의 수를 표현할 수 있도록 설계되었다. 이를 통해 과학적, 공학적 계산에 필요한 매우 큰 수나 매우 작은 수를 효과적으로 표현할 수 있게 되었다.
부동 소수점 방식은 소수점의 위치를 자유롭게 이동시킬 수 있어 매우 큰 수와 작은 수를 효율적으로 표현할 수 있다. 이는 과학적 표기법(예: 1.23 × 10^30)과 유사한 방식으로, 가수(Mantissa)와 지수(Exponent)를 사용하여 숫자를 표현한다.
부동 소수점 방식의 특징
표현할 수 있는 값의 범위가 매우 넓다:
부동 소수점 방식은 지수(Exponent)를 사용하여 수의 크기를 조절할 수 있기 때문에, 매우 큰 수나 매우 작은 수를 효율적으로 표현할 수 있다.
예를 들어, 부동 소수점 방식은 10진수로 10^-38에서 10^+38까지의 값을 표현할 수 있다. 이는 고정 소수점 방식에 비해 훨씬 넓은 범위이다.
정밀도(precision) 조절이 가능하다:
부동 소수점 방식은 정수와 소수 부분의 비율을 자유롭게 조절할 수 있어, 고정 소수점 방식보다 더 정밀하게 수를 표현할 수 있다.
가수의 비트 수가 많을수록 소수점 이하의 정밀도가 높아지고, 지수의 비트 수가 많을수록 더 큰 수나 작은 수를 표현할 수 있다.
과학적 표기법과 유사한 표현 방식:
- 예를 들어, 10진수 1.23 × 10^3은 부동 소수점 표현으로는 가수
1.23과 지수3으로 나타낼 수 있다. 이를 2진수로 변환하면,1.0011 × 2^3과 같은 형태로 표현된다.
- 예를 들어, 10진수 1.23 × 10^3은 부동 소수점 표현으로는 가수
부동 소수점 형 (Floating-point type)

각 자료형은 실수를 표현하는 데 사용되며, 표현할 수 있는 정밀도와 범위가 다르다. 이를 통해 다양한 상황에서 실수를 효율적으로 표현할 수 있게된다.
C 언어에서 부동 소수점을 표현하는 자료형은 단정도(float), 배정도(double), **확장 배정도(long double)**로 나뉜다. 각 자료형의 특징은 다음과 같다:
float (단정도, Single Precision)
크기: 32비트 (4바이트)
표현 가능한 값의 범위:
- ±1.17549 × 10^-38 ~ ±3.40282 × 10^38
특징:
메모리 사용량이 적고, 속도가 빠름.
정밀도는 배정도(
double)보다 낮음.주로 메모리 제약이 큰 임베디드 시스템에서 사용하거나, 높은 정밀도가 필요하지 않은 경우에 사용된다.
double (배정도, Double Precision)
크기: 64비트 (8바이트)
표현 가능한 값의 범위:
- ±2.22507 × 10^-308 ~ ±1.79769 × 10^308
특징:
정밀도가
float보다 높아, 더 정확한 소수점 연산을 수행할 수 있음.과학 및 공학 분야의 계산에서 주로 사용됨.
메모리 사용량은
float보다 크지만, 더 넓은 표현 범위와 정밀도를 제공.
(3) long double (확장 배정도, Extended Double Precision)
크기: 일반적으로 64비트 이상 (시스템에 따라 80비트, 128비트로 구현되기도 함)
표현 가능한 값의 범위:
double보다 더 넓은 범위를 가질 수 있으며, 정밀도 또한 높음.
특징:
매우 높은 정밀도가 요구되거나, 극도로 큰 수나 작은 수를 표현해야 할 때 사용.
메모리 사용량이 가장 큼.
자료형 간 비교
float < double < long double 순서로 정밀도와 표현 가능한 값의 범위가 커진다.
속도와 메모리:
float은 속도가 빠르고 메모리 사용량이 적지만 정밀도가 낮고, 표현할 수 있는 값의 범위가 좁다.double은 정밀도가 높아 다양한 계산에서 안정적인 결과를 제공한다.long double은double보다 더 높은 정밀도를 제공하지만, 메모리 사용량이 많고 연산 속도가 상대적으로 느릴 수 있다.
각 자료형의 사용 예제
다음 예제는 각 부동 소수점 자료형을 사용하여 실수를 표현하는 방법과, 변수의 크기를 확인하는 코드이다.
#include <stdio.h>
int main() {
float a = 3.14f; // float형 변수 선언 및 초기화
double b = 3.14; // double형 변수 선언 및 초기화
long double c = 3.14L; // long double형 변수 선언 및 초기화
printf("float: %f\n", a); // 출력: float: 3.140000
printf("double: %lf\n", b); // 출력: double: 3.140000
printf("long double: %Lf\n", c); // 출력: long double: 3.140000
printf("float 자료형의 크기: %zu 바이트\n", sizeof(float)); // 출력: 4 바이트
printf("double 자료형의 크기: %zu 바이트\n", sizeof(double)); // 출력: 8 바이트
printf("long double 자료형의 크기: %zu 바이트\n", sizeof(long double)); // 시스템에 따라 8, 10, 16 바이트 등
return 0;
}
부동 소수점 자료형의 표현 범위 및 크기 요약
| 자료형 | 명칭 | 크기 | 표현 범위 |
float | 단일 정밀도 (Single Precision) | 32비트 | ±1.17549 × 10^-38 ~ ±3.40282 × 10^38 |
double | 배정도 (Double Precision) | 64비트 | ±2.22507 × 10^-308 ~ ±1.79769 × 10^308 |
long double | 확장 배정도 (Extended Precision) | 64비트 이상 | 시스템에 따라 다름 (더 넓은 범위를 표현할 수 있음) |
부동 소수점 자료형 사용 시 주의사항
정밀도 손실:
- 부동 소수점 자료형은 근사값(Approximate value)을 사용하여 실수를 표현하기 때문에, 정밀도 손실(Precision loss)이 발생할 수 있다. 특히, 매우 작은 수나 매우 큰 수를 계산할 때 오차가 생길 수 있으므로 주의해야 한다.
부동 소수점 비교:
- 부동 소수점 수를 비교할 때는, 두 값이 정확히 일치하는지 확인하는 대신 허용 오차를 설정하여 비교하는 것이 좋다. 예를 들어,
if (fabs(a - b) < 0.000001)와 같은 방법을 사용할 수 있다.
- 부동 소수점 수를 비교할 때는, 두 값이 정확히 일치하는지 확인하는 대신 허용 오차를 설정하여 비교하는 것이 좋다. 예를 들어,
메모리 사용량:
float은 메모리 사용량이 적지만 정밀도가 낮기 때문에, 정밀한 연산이 필요할 경우double이나long double을 사용하는 것이 좋다.
실수를 출력하는 형식 지정자 (Format specifier for printing real numbers)
%f(고정 소수점 형식, Fixed-point notation)
printf(“%f”, 0.123456789);
0.123457 출력
실수를 일반적인 소수점 형태로 출력
%e (지수 표기법, Exponential notation)
printf(“%e”, 0.123456789);
1.234568e-001 출력
실수를 지수표기법으로 출력 매우 큰 수 또는 매우 작은 수를 가수(Mantissa)와 지수(Exponent)의 형태로 간략하게 표현한다.
예제

실수를 지수 표기법으로 표현 (Expressing real numbers in exponential notation)
지수 표기법은 매우 큰 수나 매우 작은 수를 간략하게 표현할 수 있는 방법으로 특히 매우 큰 수나 작은 수를 다루는 데 유리하다. 이를 통해 숫자의 크기를 쉽게 파악하고 계산을 보다 간단하게 수행할 수 있게된다. 과학 및 공학 분야에서 많이 사용된다. 아래에서는 이미지에 나온 내용을 자세히 설명하고, 지수 표기법의 특징을 살펴보자.
지수 표기법(Exponential Notation)이란?
지수 표기법은 실수를 **
가수(Mantissa)**와 **지수(Exponent)**의 형태로 표현하는 방법이다.지수 표기법에서는 수의 크기를 조정하기 위해 10을 기준으로 하는 지수를 사용하며, 이를 통해 매우 큰 수나 매우 작은 수를 간략하게 나타낼 수 있다.
지수 표기법에서는
e또는E를 사용하여 지수(10의 거듭제곱)를 나타낸다. 예를 들어,1.234e+2는 1.234 × 10^2 (123.4)를 의미한다.

이미지의 예제 설명
이미지에서 여러 실수를 지수 표기법으로 변환한 예가 나와 있다. 각 예제는 실수의 지수 표기법 표현과 그 의미를 나타낸다.
예제 1: 123.45 → 1.2345e2
지수 표기법:
1.2345e2- 이는
1.2345 × 10^2를 의미하며, 123.45와 동일하다.
- 이는
예제 2: 12345.0 → 1.2345e4
지수 표기법:
1.2345e4- 이는
1.2345 × 10^4로, 12345와 동일하다.
- 이는
예제 3: 0.000023 → 2.3e−5
지수 표기법:
2.3e−5- 이는
2.3 × 10^-5로, 0.000023과 동일하다.
- 이는
예제 4: 2,000,000,000 → 2.0e9
지수 표기법:
2.0e9- 이는
2.0 × 10^9로, 20억(2,000,000,000)과 동일하다.
- 이는
지수 표기법의 특징
소수점만 사용 가능:
- 소수점 부분만 있어도 지수 표기법으로 표현할 수 있다. 예:
1.2345e2
- 소수점 부분만 있어도 지수 표기법으로 표현할 수 있다. 예:
정수부 없이 표현 가능:
- 정수부 없이 소수점만 사용하여도 지수 표기법으로 표현할 수 있다. 예:
.28e1
- 정수부 없이 소수점만 사용하여도 지수 표기법으로 표현할 수 있다. 예:
지수부에 양수와 음수를 모두 사용 가능:
- 지수부에
+또는−기호를 붙여 수의 크기를 조절할 수 있다. 예:2e+10,0.67e-9
- 지수부에
지수 표기법의 예제 설명
이미지 하단에는 다양한 지수 표기법 예제가 나와 있다. 각 예제의 의미는 다음과 같다.
1.23456
- 일반적인 실수 표현.
1.23456
- 일반적인 실수 표현.
2.
- 정수부만 사용하여 소수점 이하를 생략한 표현.
2
- 정수부만 사용하여 소수점 이하를 생략한 표현.
.28
- 소수부만 사용한 표현. 이는
0.28과 동일함.
- 소수부만 사용한 표현. 이는
2e+10
2 × 10^10을 의미하며, 매우 큰 수를 나타냄.
9.26E3
9.26 × 10^3을 의미하며, 9260과 동일함.
0.67e−9
0.67 × 10^-9을 의미하며, 매우 작은 수를 나타냄.
지수 표기법의 장점
간결한 표현:
- 지수 표기법은 매우 큰 수(예: 1.23 × 10^9)와 매우 작은 수(예: 1.23 × 10^-9)를 간결하게 표현할 수 있다.
가독성 향상:
- 숫자가 너무 크거나 작은 경우, 가독성이 떨어질 수 있지만 지수 표기법을 사용하면 수의 크기를 쉽게 파악할 수 있다.
계산의 용이성:
- 과학적 계산에서 지수 표기법을 사용하면, 덧셈, 뺄셈, 곱셈, 나눗셈 연산이 더 간단해진다. 예를 들어, 1.23 × 10^3과 4.56 × 10^5를 곱할 때 지수끼리 더하고 가수를 곱하는 방식으로 계산할 수 있게된다.
부동 소수점 오버플로우 (Floating-point overflow)
오버플로우는 데이터의 크기가 변수나 자료형이 표현할 수 있는 최대값을 초과할 때 발생하는 현상이다.
C 언어로 작성된 프로그램에서 **부동 소수점 변수 float**의 범위를 초과하여 **오버플로우(Overflow)**가 발생한다. 이 상황에서는 변수가 표현할 수 있는 범위를 벗어난 값이 할당될 때, **무한대(inf)**로 출력되거나, 부정확한 값 출력, 프로그램 비정상 종료등의 문제가 생길 수 있다.

코드 설명
변수
x선언 및 초기화:float형 변수x를 선언하고,1e39(1 × 10^39)라는 매우 큰 값을 할당한다.이 값은
float자료형이 표현할 수 있는 범위를 초과하는 값이다.
printf함수:printf("x = %e\n", x);구문에서,%e형식 지정자를 사용하여x의 값을 지수 표기법(Exponential Notation)으로 출력한다.
오버플로우 발생:
1e39는float자료형이 표현할 수 있는 최대값(약 ±3.40282 × 10^38)을 초과하므로, 오버플로우가 발생한다.오버플로우가 발생한
x의 값은inf(무한대)로 출력되게 된다.
해결 방법 및 주의사항
부동 소수점 자료형의 오버플로우를 방지하기 위해 다음과 같은 방법을 사용할 수 있다:
자료형 변경:
float대신 더 큰 범위를 표현할 수 있는double또는long double자료형을 사용하여 오버플로우를 방지한다.예:
float x = 1e39;대신double x = 1e39;로 변경
값의 범위 체크:
변수를 할당하거나 연산을 수행하기 전에, 값의 범위를 체크하여 오버플로우가 발생하지 않도록 해야 한다.
예:
if (x > FLT_MAX) { ... }(FLT_MAX는float자료형의 최대값)
오버플로우 발생 시 대체 값 설정:
- 오버플로우가 발생하면
inf대신 특정한 대체 값을 설정하여 프로그램의 동작을 제어할 수도 있다.
- 오버플로우가 발생하면
부동 소수점 언더플로우 (Floating-point underflow)
언더플로우는 값이 너무 작아져서 변수나 자료형이 표현할 수 있는 최소값을 벗어날 때 발생하는 현상이다. 언더플로우가 발생하면 다음과 같은 결과가 나올 수 있다.
0으로 출력:
- 값이 너무 작아 변수의 값이
0으로 설정될 수 있다. 예:float형에서1.23456e-46와 같은 값은0으로 출력된다.
- 값이 너무 작아 변수의 값이
근사값으로 출력:
- 언더플로우가 발생하기 직전의 값은 정확한 값이 아니라 근사값으로 출력될 수 있다. 예:
1.23456e-40이1.234558e-040으로 출력된 경우.
- 언더플로우가 발생하기 직전의 값은 정확한 값이 아니라 근사값으로 출력될 수 있다. 예:

코드의 주요 내용:
변수
x,y,z의 선언 및 초기화:x에1.23456e-38을 할당. 이는float자료형이 표현할 수 있는 최소값 근처의 값이다.y에1.23456e-40을 할당한다.float의 최소값보다 더 작은 값이지만, 여전히 표현이 가능할 것이다.z에1.23456e-46을 할당합니다. 이 값은float자료형의 표현 범위를 벗어난 매우 작은 값이므로 언더플로우가 발생하여0으로 출력된다.
printf함수로 각 변수 값 출력:x,y,z의 값을%e형식 지정자(지수 표기법)로 출력한다.
코드를 실행하면 다음과 같은 결과가 출력된다:
x = 1.234560e-038
y = 1.234558e-040
z = 0.000000e+000
x = 1.234560e-038:x는1.23456e-38로 정상적으로 출력되었다. 이는float자료형이 표현할 수 있는 최소값 근처의 값이다.
y = 1.234558e-040:y는1.23456e-40으로,float의 표현 범위를 조금 벗어난 작은 값이지만, 여전히 근사값으로 표현할 수 있다.1.234558e-040은1.23456e-40을 부동 소수점 방식으로 표현한 근사값이다.
z = 0.000000e+000:z에 할당된1.23456e-46은float자료형으로 표현할 수 있는 최소값보다 훨씬 작은 값이다.이 값은 언더플로우가 발생하여,
z의 값이0으로 출력되었다.
해결 방법 및 주의사항
언더플로우를 방지하고, 매우 작은 값을 다룰 때 주의해야 할 몇 가지 방법은 다음과 같다.
자료형 변경:
float대신 더 정밀한double또는long double자료형을 사용하여 언더플로우를 방지할 수 있다.예:
float z = 1.23456e-46;대신double z = 1.23456e-46;로 변경.
값의 범위 체크:
변수를 할당하거나 연산을 수행하기 전에, 값이 언더플로우를 일으키지 않는지 체크한다.
예:
if (z < FLT_MIN) { ... }(FLT_MIN은float형의 최소값)
오버플로우 및 언더플로우 예외 처리:
- 오버플로우와 언더플로우가 발생할 때 적절한 예외 처리를 수행하여 프로그램의 비정상 종료를 방지할 수 있다.
부동소수점형 사용시 주의사항 (Precautions when using floating-point type)
부동 소수점 연산에서는 정밀도 손실과 연산 오차가 발생할 수 있다. 첫 번째 예제에서는 매우 큰 값과 작은 값의 연산에서 정밀도 차이로 인해 작은 값이 무시되고 결과가 0이 되는 문제를 설명하고 있다. 두 번째 예제에서는 float 자료형으로 0.1을 정확하게 표현하지 못해 근사값으로 출력되는 문제를 보여준다.
따라서, 부동 소수점 연산을 사용할 때는 정밀도와 오차에 주의하여, 적절한 자료형 선택과 오차를 고려한 연산 방식을 사용하는 것이 중요하다.
- 연산오차

double 자료형의 정밀도는 소수점 이하 약 15자리까지 정확하게 표현할 수 있다. 1.0e20과 같은 매우 큰 수와 5.0과 같은 작은 수를 더할 때, 작은 수는 큰 수에 비해 정밀도가 떨어지므로 더해지지 않거나 무시된다.
- 부동 소수점 덧셈의 특성: 부동 소수점 덧셈 연산에서는 정밀도가 낮은 값이 무시될 수 있다. 예를 들어,
1.0e20에5.0을 더하면 실제로는1.0e20으로 근사되어 저장되기 때문에5.0이 더해지지 않게된다. 따라서1.0e20 - 1.0e20의 결과는0이 되었다.
- 정밀도 손실

출력 결과
0.10000000149011611938은 우리가 기대한0.1이 아닌 근사값이다.이는 이진법으로 실수를 정확하게 표현할 수 없는 경우에 발생하는 현상이다. 즉,
0.1을 2진수로 변환할 때 무한소수로 변환되므로, 컴퓨터는 이 값을 근사값으로 저장하게 된다. 이 때문에float또는double자료형에서는0.1을 완벽하게 저장하지 못하고, 근사값으로 저장된다. 또한float형은 32비트로, 소수점 이하의 정밀도를 충분히 표현하지 못하기 때문에,0.1을 정확하게 저장할 수 없다.이러한 정밀도 문제는 부동 소수점 방식에서 자주 발생하는 문제로, 매우 작은 오차가 누적될 수 있다.
3️⃣ 문자 표현 방법 (Character expression)
문자형 char은 3가지의 하위 분류로 나뉠 수 있다.
1)일반 문자(Printable Characers)
2)제어 문자(Control Characters)
3)특수 문자(Special Characters)

1) 일반 문자(Printable Characers) : 문자형으로서의 char (Character Type char)
1. 문자는 컴퓨터보다는 인간에게 중요
문자는 우리가 일상생활에서 사용하는 언어를 표현하기 위한 기본 단위로, 사람들이 정보를 읽고 이해하는 데 중요하다.
컴퓨터는 기본적으로 숫자(이진수)로 연산을 수행하기 때문에, 문자 자체는 컴퓨터보다는 인간에게 의미가 있다.
2. 문자도 숫자를 이용하여 표현
컴퓨터는 모든 데이터를 이진수(0과 1)로 저장하고 처리한다. 따라서 문자도 숫자로 변환하여 표현해야 한다.
예를 들어, 알파벳 'A'는 10진수
65에 해당하며, 컴퓨터 내부에서는 이 값이 2진수로 변환되어 저장된다. (01000001).
3. 공통적인 규격이 필요하다
문자를 숫자로 표현할 때, 모든 컴퓨터가 동일한 규칙을 사용하여 문자를 해석해야 한다. 이를 위해 공통적인 규격이 필요하다.
이러한 규격이 없다면, 동일한 숫자값을 서로 다른 문자가 될 수 있어, 일관성 있는 데이터 해석이 어렵게 된다.
4. 아스키 코드(ASCII)
아스키 코드(ASCII: American Standard Code for Information Interchange)는 문자, 숫자, 기호 등을 숫자값으로 변환하여 표현하기 위한 표준 규격이다.
아스키 코드는 7비트를 사용하여 128개의 문자를 표현할 수 있으며, 대소문자 알파벳, 숫자, 특수기호, 제어문자를 포함한다.
5. 아스키 코드 예제
A의 아스키 코드 값:65a의 아스키 코드 값:970의 아스키 코드 값:48!의 아스키 코드 값:33


이러한 아스키 코드를 사용하여, 컴퓨터는 문자를 숫자(이진수)로 변환하여 저장하고, 다시 그 숫자를 문자로 변환하여 출력한다. 아스키 코드는 문자 데이터를 일관성 있게 처리하기 위해 사용되는 기본적인 문자 인코딩 방식이며, 오늘날에도 유니코드와 같은 확장된 문자 집합의 기초가 되었다.
문자 변수(Character Variable): char형을 사용하여 문자를 저장한다.


이 예제는 C 언어에서 문자를 저장하고 출력하는 두 가지 방법을 보여준다. 문자를 직접 입력할 수 있고, 문자에 대응하는 아스키 코드 값을 사용하여 문자를 표현할 수도 있다. 이를 통해, 문자 데이터는 컴퓨터 내부에서 숫자 값(아스키 코드)로 저장되고 처리된다는 사실을 확인할 수 있다.
각 줄 설명:
char code1 = 'A';:code1이라는 문자형(char) 변수를 선언하고 **문자 'A'**로 초기화하였다.문자 'A'는 아스키 코드 값 65에 해당한다.
char code2 = 65;:code2라는 문자형(char) 변수를 선언하고 아스키 코드 값 65로 초기화하였다.아스키 코드 값 65는 문자 'A'와 동일하므로, 이 변수에도 'A'가 저장되게 된다.
printf("code1 = %c\n", code1);:**
%c**는printf에서 **문자(character)**를 출력하는 형식 지정자(format specifier)이다.code1에 저장된 문자 'A'가 출력되게 된다.
printf("code2 = %c\n", code2);:code2역시 아스키 코드 값 65를 문자로 출력할 때, 문자 'A'로 변환되어 출력된다.
이렇게 문자를 숫자로 변환하는 규칙을 아스키 코드(ASCII)라고 하며, 이를 통해 컴퓨터는 문자를 처리할 수 있게된다.
정수형으로서의 char형 (char type as an integer type)
char형이 8비트 크기의 정수형 데이터 타입으로 사용되는 경우이다.이때
char는 정수 값(0 ~ 255 또는 -128 ~ 127)을 저장하고, 정수 연산에 사용될 수 있다.예를 들어,
char num = 65;는 정수 65를 저장하는 변수로 사용된다.
2) 제어 문자(Control Characters)

제어 문자(Control Characters)는 인쇄나 화면 출력이 아닌 특정한 제어 기능을 수행하기 위해 사용되는 문자들이다. 컴퓨터 프로그램에서 텍스트 포맷팅을 하거나, 특정 동작을 수행할 때 주로 사용된다. 또한, 통신 프로토콜에서 데이터 전송을 제어하거나, 프린터와 같은 장치를 제어하는 데도 사용할 수 있다.
특징
제어 문자는 화면에 표시되지 않으며, 특정 제어 기능을 수행한다.
예를 들어, 줄바꿈이나 탭, 벨소리와 같은 기능을 수행할 때 사용된다.
제어 문자를 나타내는 방법 2가지
제어 문자는 화면 출력이 아닌 특정 제어 기능을 수행하기 위한 문자이다. 제어 문자는 문자 그대로 표현하기 어렵기 때문에, 주로 아스키 코드(ASCII code)나 이스케이프 시퀀스(Escape sequence)를 사용하여 표현한다.
1. 아스키 코드를 직접 사용
제어 문자는 아스키 코드 값으로 직접 초기화할 수 있다. 예를 들어, 다음 코드에서는 벨소리 문자를 나타내기 위해 아스키 코드 값 7을 사용하여 beep 변수를 초기화한다.
char beep = 7; // 아스키 코드 값 7을 이용하여 벨소리 문자 초기화
printf("%c", beep); // 벨소리 문자를 출력 (컴퓨터에 따라 경고음이 들림)
아스키 코드 값 7: 벨소리(Bell,
BEL)에 해당하며, 컴퓨터에서 경고음을 발생시킵니다.printf("%c", beep);는beep변수를 문자 형식으로 출력하므로, 벨소리 제어 문자가 실행된다.
2. 이스케이프 시퀀스(Escape Sequence) 사용
이스케이프 시퀀스는 **백슬래시(\)**를 사용하여 문자나 제어 문자를 나타내는 방법이다. 이스케이프 시퀀스를 사용하면 제어 문자를 더 읽기 쉽게 표현할 수 있다.
char beep = '\a'; // 이스케이프 시퀀스 '\a'를 이용하여 벨소리 문자 초기화
printf("%c", beep); // 벨소리 문자를 출력 (컴퓨터에 따라 경고음이 들림)
\a: 벨소리 문자를 나타내는 이스케이프 시퀀스입니다.이스케이프 시퀀스를 사용하면, 아스키 코드 값으로 직접 초기화하지 않고도 제어 문자를 쉽게 사용할 수 있다.
3. 다양한 제어 문자와 이스케이프 시퀀스
제어 문자는 다양한 이스케이프 시퀀스를 통해 표현할 수 있다. 대표적인 제어 문자와 그 이스케이프 시퀀스는 다음과 같다:
| 제어 문자 | 이스케이프 시퀀스 | 아스키 코드 값 | 설명 |
| 벨소리 | \a | 7 | 경고음이나 벨소리를 발생시킴 |
| 백스페이스 | \b | 8 | 커서를 한 칸 뒤로 이동 |
| 줄바꿈 | \n | 10 | 커서를 다음 줄로 이동 (줄바꿈) |
| 탭 | \t | 9 | 커서를 다음 탭 위치로 이동 |
| 수직 탭 | \v | 11 | 커서를 다음 수직 탭 위치로 이동 |
| 폼 피드 | \f | 12 | 커서를 다음 페이지로 이동 (새 페이지 시작) |
| 캐리지 리턴 | \r | 13 | 커서를 현재 줄의 처음으로 이동 |
| 이스케이프 | \e (비표준) | 27 | 제어 시퀀스의 시작 (비표준, 일부 컴파일러 지원) |
| 널 문자 | \0 | 0 | 문자열의 끝을 나타내는 널(Null) 문자 |

프로그램에서 경고음을 내려면?
char beep = '\a'; // 이스케이프 시퀀스 '\a'를 사용하여 경고음 문자 초기화
printf("%c", beep); // %c 형식 지정자로 beep를 출력 (경고음 발생)
printf("\a"); // 직접 이스케이프 시퀀스를 사용하여 경고음 발생
이미지에서는 특수 문자열(이스케이프 시퀀스)을 사용하여 프로그램에서 경고음을 발생시키는 방법을 설명하고 있다. 이 예제는 \a라는 이스케이프 시퀀스를 사용하여 컴퓨터에서 벨소리(BEEP)나 경고음을 울리는 코드이다.
각 줄 설명:
char beep = '\a';:이스케이프 시퀀스
\a를 사용하여 경고음 문자(BEL, Bell)를 초기화한다.\a는 아스키 코드에서 벨소리 문자에 해당하며, 컴퓨터에서 경고음이나 알림음을 울리는 기능을 수행한다.
printf("%c", beep);:printf의%c형식 지정자는 문자를 출력한다.beep변수에 저장된 벨소리 문자가 출력되며, 컴퓨터의 스피커에서 경고음(beep sound)이 발생할 수 있다.
printf("\a");:이스케이프 시퀀스
\a를 직접 출력하여 경고음을 발생시킨다.앞서 변수에 할당하지 않고도,
\a를 직접printf에서 사용할 수 있다.
2. 경고음 발생 설명
\a는 아스키 코드에서 BEL에 해당하는 문자로, 경고음 또는 알림음을 발생시키기 위한 목적으로 사용되는데,printf("\a");를 실행하면, 프로그램이 컴퓨터의 스피커를 통해 경고음을 발생시키게 된다. 이는 사용자가 프로그램의 특정 동작(에러, 알림 등)에 주의를 기울이도록 하는 기능을 제공한다.
3. 이스케이프 시퀀스 \a의 의미
\a는 Alert 또는 Audible Alert의 약자로, 경고음이나 알림음을 나타내는 문자이다.이스케이프 시퀀스
\a는 컴퓨터의 하드웨어(스피커, 알림 장치 등)가 경고음을 울리도록 하며, 대부분의 시스템에서 이를 지원한다.
4. 주의사항
일부 시스템에서는
\a가 경고음을 발생시키지 않을 수도 있다. 특히, 경고음이 비활성화된 경우나 하드웨어적 경고음 장치가 없는 경우에는 동작하지 않을 수 있음을 알아두자.이러한 경우, 다른 방법(예: 화면 출력, 파일 기록 등)으로 사용자에게 경고를 전달할 수 있다.
3) 특수문자(Special Characters): 역슬래시 \
역슬래시(Backslash) \는 C 언어에서 제어 문자나 이스케이프 시퀀스를 나타내는 특수 문자로 데 사용된다. 특정 문자 앞에 역슬래시를 붙이면 해당 문자의 특수한 의미를 제거하고 문자 그대로 출력할 수 있다. 이를 통해 큰따옴표, 역슬래시, 특수 문자를 출력하거나 제어 문자를 표현할 때 유용하게 사용할 수 있게 된다.
1. 역슬래시의 사용 목적
특수한 기능을 가진 문자의 의미를 없애기 위해 사용한다.
특정 문자 앞에 역슬래시(
\)를 붙이면 그 문자의 특수한 기능을 제거하고, 문자 그대로 출력할 수 있다.예를 들어, **큰따옴표(")**나 역슬래시() 자체를 출력하고 싶을 때 사용된다.
2. 역슬래시 사용 예제
예제 1: 큰따옴표를 출력하기
printf(" \"나만의 할리우드\" UCC 열풍 ");
출력 결과:
“나만의 할리우드” UCC 열풍설명:
큰따옴표(
")는 문자열의 시작과 끝을 나타내는 특수한 문자이다.문자열 안에 큰따옴표를 문자 그대로 출력하려면, 큰따옴표 앞에 **역슬래시(
\)**를 붙여야 한다.따라서
\"나만의 할리우드\"라고 작성하면 큰따옴표가 문자열의 일부로 출력되게 된다.
예제 2: 역슬래시 자체를 출력하기
printf(" \\는 제어 문자를 표시할 때 사용한다. ");
출력 결과:
\는 제어 문자를 표시할 때 사용한다.설명:
역슬래시(
\)는 이스케이프 시퀀스를 나타내는 특수 문자이기 때문에, 문자 그대로 출력하기 위해서는 **역슬래시 두 개(\\)**를 사용해야 한다.따라서
\\로 작성하면 화면에 역슬래시(\) 하나가 출력되게 된다.
3. 역슬래시를 사용하는 주요 이스케이프 시퀀스
역슬래시는 이스케이프 시퀀스를 나타내기 위해 사용된다. 다음은 대표적인 이스케이프 시퀀스와 그 의미이다.
| 이스케이프 시퀀스 | 설명 | 출력 예제 |
\" | 큰따옴표를 문자 그대로 출력 | printf("\""); |
\' | 작은따옴표를 문자 그대로 출력 | printf("\'"); |
\\ | 역슬래시 자체를 출력 | printf("\\"); |
\n | 줄바꿈 (새로운 줄로 이동) | printf("Hello\n"); |
\t | 탭 (탭 간격만큼 이동) | printf("Hello\tWorld"); |
\a | 경고음 (벨소리 발생) | printf("\a"); |
4. 역슬래시 사용 시 주의사항
이스케이프 시퀀스로 사용되지 않는 문자는 역슬래시와 함께 사용해도 의미를 가지지 않는다.
- 예:
\z는 C 언어에서 정의되지 않은 이스케이프 시퀀스이므로, 에러가 발생한다.
- 예:
이스케이프 시퀀스를 사용할 때:
- 항상 정의된 이스케이프 시퀀스를 사용해야 하며, 잘못된 이스케이프 시퀀스는 컴파일 에러를 일으킬 수 있다.


