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
- 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
'Study_C, C++ > 홍정모의 따라하며 배우는 C언어' 카테고리의 다른 글
[홍정모의 따라하며 배우는 C언어] 3.9 고정 너비 정수 ~ 3.10 문자형 (0) | 2021.08.10 |
---|---|
[홍정모의 따라하며 배우는 C언어] 3.7 다양한 정수형들 ~ 3.8 8진수와 16진수 (0) | 2021.08.08 |
[홍정모의 따라하며 배우는 C언어] 3.4 간단한 입출력 프로그램 만들기 (0) | 2021.08.02 |
[홍정모의 따라하며 배우는 C언어] 3.1 데이터와 자료형 ~ 3.3 scanf() 함수의 기본적인 사용법 (0) | 2021.07.25 |
[홍정모의 따라하며 배우는 C언어] 2.11 문법 오류와 문맥 오류 ~ 2.12 읽기 좋은 코드를 만드는 요령 (0) | 2021.07.23 |