최소크기인데 값의 범위에서 벗어나면 오버플로우되는 건 왜 그런가요?
char, int ...은
최소 크기가 각각 1byte, (2byte or )4 byte ...인데
자료형 데이터의 값이
-128 ~ 127,
(-32,768 ~ 32,767 or)
-2,147,483,648 ~ 2,147,483,647 ...을 벗어나면
overflow가 발생하는 이유가 무엇인가요?
최소 크기라면 그 이상을 넘어가는 값은
long long int로 지정해줄 필요도 없는 거 아닌가요?
Câu trả lời 3
1
오버플로우가 발생하는 이유는, 그냥 단순하게 그것보다 작은 값은 해당 자료형으로 표현할 수 없기 때문입니다. 그래서 해당 자료형으로 표현할 수 있는 값의 최소값보다 더 작은 값을 담으려고 시도하면 그 값을 담을 수 없기 때문에 오히려 순환하듯, 해당 자료형으로 표현할 수 있는 최대값으로 돌아가는 오버플로우가 발생합니다.
char 는 말씀하신 것처럼 1byte 입니다. 1byte 는 곧 8 bit 과 같기 때문에 char 는 2^8 = 256 개의 정수만!! 표현할 수 있습니다. char (=signed char) 는 부호 있는 음,양 정수를 담을 수 있는 타입으로 정의가 되어 있기 때문에 (-2^7) ~ (2^7 - 1) = -128 ~ 127 이렇게 총 256 개의 정수만 표현할 수 있는 것입니다. 따라서 130를 char 에 담으려고 한다면 온전히 130값으로서 담는건 불가능합니다. 왜냐하면 앞서 말씀드린 것처럼 char 는 8bit 이기 때문에 256 개의 정수만 표현 할 수 있는데 ,부호도 표현 가능하다는 전제가 있는 자료형이기 때문에 -128 ~127 이 범위만 표현할 수 있습니다. 즉, 온전히 130그 자체로 표현하려면 8bit 넘게 필요하다는 것입니다. 따라서 -128 ~127 사이의 정수만 저장할 수 있는 (8bit 만으로 표현해야하기에) char 는 130를 온전히 담을 수 없어 오버플로우 해버립니다. char 입장에서는 -128 로 저장되는 오버플로우가 시작되는 정수는 128부터이니, 128(-128), 129(-127), 130(-126) 이렇게해서 130을 char 에 저장하면 오버플로우로 인하여 -126 으로 저장되게 됩니다.
반대로, 양수만 저장가능한 unsigned char 는 마찬가지로 256개의 정수를 표현할 수 있는데 음수 표현은 하지 않기에 범위가 0 ~ 255 가 됩니다. 130 을 unsigned char 에 담으려고 하면 아무 문제없이 온전히 130으로 잘 저장이 될 것입니다. 130은 unsigned char 의 1byte로는 표현 가능한 정수이기 때문입니다.
여기까지 오버플로우가 발생하면 잘못된 값으로 저장된다는 것을 알게 되었습니다. 그래서 값을 저장할 때 알맞는 자료형 타입의 변수에 저장하는 것이 중요해요. 그 값을 표현할 수 없는 변수에 저장하면 오버플로우로 인하여 쌩뚱맞은 값이 저장되니까요.
"최소 크기라면 그 이상을 넘어가는 값은 long long int로 지정해줄 필요도 없는 거 아닌가요?" 라고 말씀을 하셨는데 이건 제가 어떤 말씀인지 잘 이해가 되지 않지만 드리고 싶은 말씀은 그 이상 넘어가는 값은 더더욱 그 값을 표현할 수 있는 더 큰 자료형에 저장을 해야 된다는 것입니다! 예를 들어 지구 인구는 70억이니까 4byte = 32bit = 2^32 -> 약 21억 정도까지만 양수 표현이 가능한 int 로는 지구 인구수 값을 담을 수가 없습니다. int 에 저장하면 오버플로우가 발생하여 70억이 아닌 쌩뚱맞은 값으로 저장이 될 것입니다. 그러니 지구 인구 수는 long long int 같은 더 큰 자료형에 저장을 해야겠구나! 하고 생각을 해야겠지요. 이건 값이 양수든 음수든 상관 없이 공통적으로 생각해야하는 부분입니다. 만약 음수인 -50 억을 온전히 담을 수 있으려면 마찬가지로 음수는 -21억까지만 오버플로우 없이 제대로 저장할 수 있는 int 말고 long long 에 담아야겠습니다.
0
char는 1byte인게 아니라 1byte가 최소크기인 것이 아닌가요? 그 의미가 무엇인지 잘 이해가 되지 않습니다. 예를 들어 char가 1byte이면 그 안에서 최대값+A 최소값-B이 8bit안에서 순환한다는 의미는 잘 알겠는데 최대크기가 1byte인게 아니라 최소크기가 1byte 니깐 이 부분이 직관적으로 잘 이해가 안됩니다.
예를 들면 char라는 값이 최소크기가 1byte라는 뜻은 시스템에 따라 가변적으로 2byte 혹은 4byte일 수도 있으나 최소크기 1byte 이상이어야 한다는 뜻이고 지금 현재 우리가 사용하는 시스템에서는 1byte라면 그 값을 넘어가는 자료형 데이터에 한해서 overflow 된다는 의미면 이해가 되네요 맞나요?
int의 최소크기가 2byte 혹은 4byte 라고 표현되어있어서 헷갈린 거 같습니다. 제가 이해한 것이 맞다면 int의 최소크기는 2byte이고 현재 우리가 사용하는 시스템에서는 4byte인 것이 되겠네요.
1
(댓글 달고 있었는데 삭제하셔서 다시 답니다. 삭제하신 답글에 대한 답변입니다!)
아 제가 강의 앞부분을 들어보니 이식성 측면에서 '최소 크기'라고 말씀을 하신거네요! 이해했습니다. 제가 오해햇네요!
네. 그렇게 이해하시면 될 것 같아요! (char 는 거의 모든 시스템에서 대부분 1byte 일 것이긴 하지만) char 가 2byte 인 시스템에서는 130 을 char 변수에 저장해도 올바르게 저장 되겠지만 char 가 1byte 인 시스템에서 130을 char 변수에 저장하면 오버플로우가 발생하여 쌩뚱맞은 값으로 저장이 되겠습니다. 반대로 현재 char 가 2byte인 시스템에서 130을 저장한 상태면 현재 시스템에선 아무 문제 없겠지만 이 코드가 만약 char가 1byte 인 시스템에 적용된다면 오버플로우로 인하여 잘못된 값으로 저장이 되겠습니다. 그래서 강의에서 이러한 이식성 측면에서 문제를 해결해주는 고정 너비 정수를 소개해주신 것 같아요.
아하 그렇군요. int 도 사실 거의 대부분의 시스템에서 4byte 긴 합니다. 2byte 인 곳은 아마 소수이지 않을까...싶네요
Export template 안됨
1
30
2
완전히 똑같이 따라해도 exe파일이 안만들어져서 실행이 안됩니다.
1
57
3
main 함수에서 왜 int만 선언이 되는걸까요
1
57
2
8비트 2진수 변환시 왜 1을 더해야하나요?
1
55
2
혹시 강의를 빠르게 수강하려면 어디서부터 듣는게 좋을까요?
1
49
1
프로토타입과 함수간의 인자 불일치
1
73
2
12.12 헤더 관련 질문
1
60
2
Visual Studio Community 2026 사용 문의
1
138
2
Q. 15:30, 부호가 있는 8비트 정수 질문
1
61
2
getchar(), putchar()
1
94
3
강의자리ㅛ
1
80
2
비주얼스튜디오코드로 공부해도 상관없나요?
1
114
2
소스파일안에 여러 파일
1
76
2
F5와 F7의 차이
1
79
2
c = TWO * (a+b); 에서 a와 b는?
1
60
2
; 세미콜론을 붙이는 기준에 문의
1
70
1
Step over 기능 문의
1
53
2
2.6 강의 따옴표 출력 규칙 문의
1
76
2
int main 함수 관련 오류 문의
1
67
2
13.4 words[0]
0
61
2
11.7 함수를 구현해 봤습니다.
1
62
2
11.6 직접 strcmp와 strncmp를 구현해 보았습니다.
1
65
2
11.6 my_strcat과 my_strncat을 구현해봤습니다.
1
53
2
11.6 fit_str함수를 구현해 봤습니다.
1
54
2

