#include <stdio.h>
#include <limits.h> // 자료형의 최댓값과 최솟값이 정의된 헤더 파일
int main()
{
char num1 = CHAR_MIN; // char의 최솟값
short num2 = SHRT_MIN; // short의 최솟값
int num3 = INT_MIN; // int의 최솟값
long num4 = LONG_MIN; // long의 최솟값
long long num5 = LLONG_MIN; // long long의 최솟값
// char, short, int는 %d로 출력하고 long은 %ld로 출력, long long은 %lld로 출력
printf("%d %d %d %ld %lld\n", num1, num2, num3, num4, num5);
// -128 -32768 -2147483648 -2147483648 -9223372036854775808
return 0;
}
-128 -32768 -2147483648 -2147483648 -9223372036854775808
char | CHAR_MIN | CHAR_MAX |
short | SHRT_MIN | SHRT_MAX |
int | INT_MIN | INT_MAX |
long | LONG_MIN | LONG_MAX |
long long | LLONG_MIN | LLONG_MAX |
unsigned char | 0 | UCHAR_MAX |
unsigned short | 0 | USHRT_MAX |
unsigned int | 0 | UINT_MAX |
unsigned long | 0 | ULONG_MAX |
unsigned long long | 0 | ULLONG_MAX |
다음과 같이 limits.h에 정의된 최댓값을 넘어서도 오버플로우가 발생한다.
#include <stdio.h>
#include <limits.h> // 자료형의 최댓값과 최솟값이 정의된 헤더 파일
int main()
{
char num1 = CHAR_MAX + 1; // char의 최댓값보다 큰 수를 할당. 오버플로우 발생
short num2 = SHRT_MAX + 1; // short의 최댓값보다 큰 수를 할당. 오버플로우 발생
int num3 = INT_MAX + 1; // int의 최댓값보다 큰 수를 할당. 오버플로우 발생
long long num4 = LLONG_MAX + 1; // long long의 최댓값보다 큰 수를 할당. 오버플로우 발생
// char, short, int는 %d로 출력하고 long long은 %lld로 출력
// 부호 있는 정수에서 저장할 수 있는 범위를 넘어서면 최솟값부터 다시 시작
printf("%d %d %d %lld\n", num1, num2, num3, num4);
// -128 -32768 -2147483648 -9223372036854775808
unsigned char num5 = UCHAR_MAX + 1; // unsigned char의 최댓값보다 큰 수를 할당
// 오버플로우 발생
unsigned short num6 = USHRT_MAX + 1; // unsigned short의 최댓값보다 큰 수를 할당
// 오버플로우 발생
unsigned int num7 = UINT_MAX + 1; // unsigned int의 최댓값보다 큰 수를 할당
// 오버플로우 발생
unsigned long long num8 = ULLONG_MAX + 1; // unsigned long long의 최댓값보다 큰 수를 할당
// 오버플로우 발생
// unsigned char, unsigned short, unsigned int는 %u로 출력하고
// unsigned long long은 %llu로 출력
// 부호 없는 정수에서 저장할 수 있는 범위를 넘어서면 최솟값 0부터 다시 시작
printf("%u %u %u %llu\n", num5, num6, num7, num8); // 0 0 0 0
return 0;
}
-128 -32768 -2147483648 -9223372036854775808 0 0 0 0
부호 있는 정수는 저장할 수 있는 범위를 넘어서면 최솟값(음수)부터 다시 시작하고, 부호 없는 정수는 범위를 넘어서면 최솟값인 0부터 다시 시작한다. 마찬가지로 최솟값보다 작아지면 언더플로우가 발생한다.
#include <stdio.h>
#include <limits.h> // 자료형의 최댓값과 최솟값이 정의된 헤더 파일
int main()
{
char num1 = CHAR_MIN - 1; // char의 최솟값보다 작은 수를 할당. 언더플로우 발생
short num2 = SHRT_MIN - 1; // short의 최솟값보다 작은 수를 할당. 언더플로우 발생
int num3 = INT_MIN - 1; // int의 최솟값보다 작은 수를 할당. 언더플로우 발생
long long num4 = LLONG_MIN - 1; // long long의 최솟값보다 작은 수를 할당. 언더플로우 발생
// char, short, int는 %d로 출력하고 long long은 %lld로 출력
// 부호 있는 정수에서 최솟값보다 작아지면 최댓값부터 다시 시작
printf("%d %d %d %lld\n", num1, num2, num3, num4);
// 127 32767 2147483647 9223372036854775807
unsigned char num5 = 0 - 1; // unsigned char의 최솟값보다 작은 수를 할당
// 언더플로우 발생
unsigned short num6 = 0 - 1; // unsigned short의 최솟값보다 작은 수를 할당
// 언더플로우 발생
unsigned int num7 = 0 - 1; // unsigned int의 최솟값보다 작은 수를 할당
// 언더플로우 발생
unsigned long long num8 = 0 - 1; // unsigned long long의 최솟값보다 작은 수를 할당
// 언더플로우 발생
// unsigned char, unsigned short, unsigned int는 %u로 출력하고
// unsigned long long은 %llu로 출력
// 부호 없는 정수에서 최솟값보다 작아지면 최댓값부터 다시 시작
printf("%u %u %u %llu\n", num5, num6, num7, num8);
// 255 65535 4294967295 18446744073709551615
return 0;
}
127 32767 2147483647 9223372036854775807 255 65535 4294967295 18446744073709551615
'코딩테스트 > 공통' 카테고리의 다른 글
문자열 (소문자 대문자 변환) transform 함수 (0) | 2022.08.12 |
---|---|
C++ stringstream 사용법 (문자열에서 공백 제외 추출, 특정값) (0) | 2022.08.11 |
C++ max_element(), min_element() 최대값, 최소값 (0) | 2022.08.11 |
백준 골5 달성 (0) | 2022.06.30 |
C++ 문자열 공백 제거하는 방법 (0) | 2022.06.27 |