Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- BOJ
- 생활코딩
- server
- Cleancode
- web
- programmers
- graph
- C언어
- BASIC
- udemy
- DP
- 백준
- 인프런
- 종만북
- 따배씨
- dfs
- BFS
- 따라하면서 배우는 C언어
- C
- sorting
- 정수론
- php
- JavaScript
- Math
- String
- Algorithm
- Algospot
- greedy
- Python
- 따라하며 배우는 C언어
Archives
- Today
- Total
몽상실현개발주의
[따배씨] 3.6 정수의 오버플로우 본문
따배씨 - 따라하며 배우는 C언어
3강 데이터와 C 언어
3.6 정수의 오버플로우
#include <stdio.h>
int main()
{
unsigned int i = 0;
printf("%u\n", sizeof(unsigned int)); // 4
printf("%u", sizeof(i)); // 4
return 0;
}
- 출력하려는 데이터가 unsigned int 라서 %u 를 사용하여 출력
#include <stdio.h>
#include <limits.h>
int main()
{
unsigned int i = 0b11111111111111111111111111111111;
// 이진수 입력법, C언어의 표준은 아니지만 대부분의 프로그래머들이 사용하기 때문에 지원
unsigned int u = UINT_MAX;
printf("%u\n", i); // 4294967295
printf("%u\n", u); // 4294967295
printf("%d", i); // -1
return 0;
}
- unsigned int i의 최대값, 2진수 32bit = 0b11111111111111111111111111111111
- limits header를 이용하여 자료값의 최대값 호출 = UNIT_MAX
- %u 가 아닌 %d 로 최대값을 출력시 "-1" 출력으로 오류발생
- signed int 값과 unsigned int 값의 최대값 범위가 다르기 때문
#include <stdio.h>
#include <limits.h>
int main()
{
unsigned int u_max = UINT_MAX;
unsigned int u_min = 0;
signed int i_max = INT_MAX;
signed int i_min = INT_MIN;
printf("max of unit = %u\n", u_max); // 4294967295
printf("max of int = %d\n", i_max); // 2147483647
printf("min of unit = %u\n", u_min); // 0
printf("min of int = %d\n", i_min); // -2147483648
return 0;
}
- unsigned int 의 범위: 0 <= u <= 4294967295(2의 32승)
- signed int 의 범위: -2147483648 (-2의 31승) <= i <= 2147483647 (2의 31승 - 1)
#include <stdio.h>
#include <limits.h>
int main()
{
unsigned int u_max = UINT_MAX+1;
unsigned int u_min = 0 - 1;
printf("max + 1: %u\n", u_max); // 0
printf("min - 1: %u\n", u_min); // 4294967295
return 0;
}
- Overflow 상황 발생
- max + 1 -> 0b11111111111111111111111111111111 + 1
- 32bit를 초과한 숫자인 0b100000000000000000000000000000000 가 됨
- 초과한 자리수인 33bit는 제외되어 남은 수인 0이 됨
- min - 1 -> 0b00000000000000000000000000000000 - 1
- 33bit 자리 수 1이 있다고 가정을 하고 -1 연산 진행
- 그 결과 32bit의 가장 큰 수가 됨
- max + 1 -> 0b11111111111111111111111111111111 + 1
이 글의 모든 사진과 내용의 출처는 홍정모 교수님께 있음을 알려드립니다.
http://blog.naver.com/atelierjpro
http://www.inflearn.com/course/following-c
'Language > C' 카테고리의 다른 글
[따배씨] 3.9 이식성이 높은 고정 너비 정수 (0) | 2021.05.11 |
---|---|
[따배씨] 3.8 8진수와 16진수 (0) | 2021.05.10 |
[따배씨] 3.5 정수와 실수 (0) | 2021.05.09 |
[따배씨] 3.4 간단한 입출력 프로그램 만들기 (0) | 2021.05.09 |
[따배씨] 3.1 데이터와 자료형 ~ 3.3 scanf() 함수의 기본적인 사용법 (0) | 2021.05.09 |
Comments