• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

최소크기인데 값의 범위에서 벗어나면 오버플로우되는 건 왜 그런가요?

21.05.29 19:02 작성 조회수 591

0

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로 지정해줄 필요도 없는 거 아닌가요?

답변 3

·

답변을 작성해보세요.

1

안소님의 프로필

안소

2021.05.29

오버플로우가 발생하는 이유는, 그냥 단순하게 그것보다 작은 값은 해당 자료형으로 표현할 수 없기 때문입니다. 그래서 해당 자료형으로 표현할 수 있는 값의 최소값보다 더 작은 값을 담으려고 시도하면 그 값을 담을 수 없기 때문에 오히려 순환하듯, 해당 자료형으로 표현할 수 있는 최대값으로 돌아가는 오버플로우가 발생합니다.

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

thd2tn님의 프로필

thd2tn

질문자

2021.05.29

 char는 1byte인게 아니라 1byte가 최소크기인 것이 아닌가요? 그 의미가 무엇인지 잘 이해가 되지 않습니다. 예를 들어 char가 1byte이면 그 안에서 최대값+A 최소값-B이 8bit안에서 순환한다는 의미는 잘 알겠는데 최대크기가 1byte인게 아니라 최소크기가 1byte 니깐 이 부분이 직관적으로 잘 이해가 안됩니다.

 예를 들면 char라는 값이 최소크기가 1byte라는 뜻은 시스템에 따라 가변적으로 2byte 혹은 4byte일 수도 있으나 최소크기 1byte 이상이어야 한다는 뜻이고 지금 현재 우리가 사용하는 시스템에서는 1byte라면 그 값을 넘어가는 자료형 데이터에 한해서 overflow 된다는 의미면 이해가 되네요 맞나요?

 int의 최소크기가 2byte 혹은 4byte 라고 표현되어있어서 헷갈린 거 같습니다. 제가 이해한 것이 맞다면 int의 최소크기는 2byte이고 현재 우리가 사용하는 시스템에서는 4byte인 것이 되겠네요.

안소님의 프로필

안소

2021.05.29

(댓글 달고 있었는데 삭제하셔서 다시 답니다. 삭제하신 답글에 대한 답변입니다!)

아 제가 강의 앞부분을 들어보니 이식성 측면에서 '최소 크기'라고 말씀을 하신거네요! 이해했습니다. 제가 오해햇네요!

네. 그렇게 이해하시면 될 것 같아요! (char 는 거의 모든 시스템에서 대부분 1byte 일 것이긴 하지만) char 가 2byte 인 시스템에서는 130 을 char 변수에 저장해도 올바르게 저장 되겠지만 char 가 1byte 인 시스템에서 130을 char 변수에 저장하면 오버플로우가 발생하여 쌩뚱맞은 값으로 저장이 되겠습니다. 반대로 현재 char 가 2byte인 시스템에서 130을 저장한 상태면 현재 시스템에선 아무 문제 없겠지만 이 코드가 만약 char가 1byte 인 시스템에 적용된다면 오버플로우로 인하여 잘못된 값으로 저장이 되겠습니다. 그래서 강의에서 이러한 이식성 측면에서 문제를 해결해주는 고정 너비 정수를 소개해주신 것 같아요.

아하 그렇군요. int 도 사실 거의 대부분의 시스템에서 4byte 긴 합니다. 2byte 인 곳은 아마 소수이지 않을까...싶네요 

0

thd2tn님의 프로필

thd2tn

질문자

2021.05.29

삭제된 글입니다
안소님의 프로필

안소

2021.05.29

오잉 최소 크기 아니에요..! 자료형 변수들은 크기가 가변적이지 않습니다. char는 1byte. int 는 4byte 이런식으로 크기가 "고정" 되어 있어요. 예를 들어 char는 1byte = 8bit 라는 고정적인 크기로 값을 표현합니다. 최소 크기라고 어떤 부분에서 오해하신 것인지 궁금합니다.