본문 바로가기

Study_C, C++/홍정모의 따라하며 배우는 C언어

[홍정모의 따라하며 배우는 C언어] 3.5 정수와 실수 ~ 3.6 정수의 오버플로우

728x90

3.5 정수와 실수

  • 정수(Integer) : 양의 정수, 0 , 음의 정수. 양의 정수와 0은 unsigned int
  • 실수(Real number) : 정수로는 표현할 수 없는 정수 사이의 작은 값들을 포함. 내부적으로 부동소수점(Floating Point) 사용
  • 정수와 실수 모두 컴퓨터 내부에서는 2진수로 사용

 

  • Signed bit : 부호가 있는 수(+2, -3등). MSB를 부호 (+,-) 표현에 사용 (0 = 양수, 1 = 음수).                                                              음수 표현시 2의 보수법 사용
  • Unsigned bit : 부호가 없는 수. 모든 bit를 숫자 표현에 사용
  • 두 bit는 표현 가능 크기는 같으나 범위가 다름. ex) signed 8 bit : -128 ~ 127, unsigned 8 bit : 0 ~ 255

 

* 부동소수점 

  • 실수를 컴퓨터상에서 근사하여 표현할 때 소수점의 위치를 고정하지 않고 그 위치를 나타내는 수를 따로 적는 것으로, 유효숫자를 나타내는 가수(위 사진에서는 분수로 표현)와 소수점의 위치를 풀이하는 지수로 나누어 표현한다.
  • ex) 0.314E1 = 0.314 * 10^1, 3.14E123 = 3.14 * 10^123, 0.314E-1 = 0.314 * 10^-1

double = float의 2배

  • float : Single Precision(단정밀도). 32 bit
  • double : Double Precision(배정밀도). 64 bit

 

3.6 정수의 오버플로우

  • 변수가 가질 수 있는 최대/최소 범위 내에서 값을 사용해야 함 -> 그 이상, 이하는 메모리에서 감당 불가
#include <stdio.h>

int main()
{
	unsigned int i = 0;

	printf("%u\n", sizeof(unsigned int));	// sizeof는 함수처럼 작동. 결과값이 unsigned int로 출력
	printf("%u\n", sizeof(i));

	return 0;
}

 

Output : 
4	
4
  • sizeof 연산자는 변수의 크기를 byte 단위로 출력 -> unsigned int는 4 byte == 32 bit 크기

 

#include <stdio.h>
#include <limits.h>	// 각 자료형의 최댓값과 최솟값을 알려줌. 메크로 상수처럼 값과 변수명이 이미 정해져 있음

int main()
{
	unsigned int i = 0b11111111111111111111111111111111;	// ob = 뒤의 리터럴이 2진수임을 표현.
   	 // C언어에서 표준은 아니지만 많은 프로그래머들이 사용하므로 컴파일러에서 지원.
   	 // 간혹 지원이 안되는 시스템이나 플렛폼도 있음
	unsigned int u = UINT_MAX;	// UNIT_MAX == limits.h 헤더파일에 정의된 unsigned int의 최댓값
	unsigned int k = 1024;

	printf("%u\n", i);			
	printf("%u\n", u);			
	printf("%d\n", i);		// unsigned int형 변수를 signed int형식 지정자로 받음
	printf("%d\n", k);			

	return 0;
}

 

Output : 
4294697295 == 4byte int의 가장 큰 숫자 (0 ~ 4294697295)
4294697295  
-1  	-> i(4294697295)는 signed int의 표현 범위(-2147483648 ~ 2147483647)내에 
    	   들어가지 않는 수여서 overflow가 발생
1024    -> 1024는 signed int의 표현 범위내에 들어가는 수여서 값이 그대로 출력

 

 

#include <stdio.h>
#include <limits.h>	

int main()
{
	unsigned int u_max = UINT_MAX;		// UNIT_MAX == unsinged int의 최댓값
	unsigned int u_min = 0;			// unsigned int의 최솟값은 0이므로 limits.h에 따로 정의되어있지 않음
	signed int i_max = INT_MAX;		// (signed) int의 최댓값
	signed int i_min = INT_MIN;		// (signed) int의 최솟값

	printf("max of uint = %u\n", u_max);	
	printf("min of unit = %u\n", u_min);	
	printf("max of int = %d\n", i_max);	
	printf("min of int = %d\n", i_min);	

	return 0;
}

 

Output : 
4294967295
0
2147483647 -> singed int는 음수부분도 표현하므로 최대 수가 unsigned int 보다 절반정도 적음
-2147483648

 

 

#include <stdio.h>
#include <limits.h>		

int main()
{
	unsigned int u_max = UINT_MAX;	
	unsigned int u_max1 = UINT_MAX + 1;	// 최댓값보다 1 큰 값
	unsigned int u_max2 = 0 - 1;		// 최솟값보다 1 작은 값

	// i to binary representation
	char buffer[33];
	char buffer1[33];
	char buffer2[33];
	_itoa(u_max, buffer, 2);		// _itoa -> u_max의 값을 2진수 형태로 바꿔줌
	_itoa(u_max1, buffer1, 2);
	_itoa(u_max2, buffer2, 2);

	// print decimal and binary
	printf("decimal : %u\n", u_max);	
	printf("binary : %s\n\n", buffer);	
	printf("decimal : %u\n", u_max1);
	printf("binary : %s\n\n", buffer1);
	printf("decimal : %u\n", u_max2);
	printf("binary : %s\n", buffer2);

	return 0;
}

 

Output : 
decimal : 4294967295
binary : 11111111111111111111111111111111

decimal : 0 			-> overflow
binary : 0

decimal : 4294967295		-> underflow
binary : 11111111111111111111111111111111
  • (1)1111 + 1 = 0000 -> overflow. 4bit 만 저장 가능할 때 5번째 bit로 간 1은 사라지는 형태가 됨. 즉 처음 값으로 돌아가는 형태가 됨
  • (1)0000 - 1 = 1111 -> underflow. 5bit 자리에 1이 있다고 가정하고 뺌. 즉 마지막 값으로 돌아가는 형태가 됨 

 

 


강의 출처 : https://www.inflearn.com/course/following-c/dashboard

 

홍정모의 따라하며 배우는 C언어 - 인프런 | 강의

'따배씨++'의 성원에 힘입어 새롭게 개발된 C 언어로 시작하는 프로그래밍 입문 강의입니다. '따배씨'와 함께 프로그래밍 인생을 업그레이드 해보세요., 따라하며 배우는 C언어 '따배씨++'의 성원

www.inflearn.com