special thanks to
본 정정은 2023년 2월 3일 저녁 6시경 친애하는 동료 hyeyukim님께서 본인의 과제 수행 중 리눅스 매뉴얼 페이지에 strtol 함수의 return값의 자료형이 integer계열인 long이고, return값이 표현할 수 있는 범위에서 최소값 미만인 경우 underflow, 최대값 초과인 경우 overflow로 기술됐음을 저에게 알려옴에 따라 보강 조사를 하였고 아래와 같이 결론을 정정함을 밝힙니다.
︎ 결론 정정 (2023.02.03)
“언더플로우, 그때는 맞고 지금은 틀리다.”
1999년 까지는 (그리고 2007년 이전 까지는) C표준에서 integer에서 연산 결과가 표현범위의 최소값 미만이 되면 underflow, 최대값을 초과하면 overflow라고 했다.
그러나 C표준이 개정을 거듭하면서 2000년대 초반 언젠가(2007년 이전)에 integer에서 underflow 개념이 사라진다. integer에서 연산 결과가 표현범위의 최소값 미만이 되면 underflow, 최대값을 초과하면 overflow 라는 표현을 삭제하고, 단순하게 표현범위를 벗어나면 overflow라고 바꾸어 정의했다.
역사적 배경이 이렇기 때문에 integer에서 용어 underflow가 현재까지 곳곳에서 발견되고 사용되고 있는 것이다.
그래서 1999년에 출간된 책 CODE의 저자 챨스 펫졸드 역시 그때는 1999년이었기에 integer 연산에서 표현범위 최소값 미만이 되는 상황을 underflow라고 서술했던 것이다.
이하 기존 내용 중 정정 내용은 취소선을, 추가 내용은 (분홍)색처리 하였음을 알려드립니다.
︎ 결론 (정정 전)
원칙적으로(학문적으로)는 1999년까지만 해도 underflow, overflow라고 했지만, 2000년 초반 C표준이 개정되면서 현재는 두 경우 모두를 ‘overflow’라고 한다.
char c1;
c1 = -129;
c2 = 128;
printf("%d", c1); //-129가 아닌 127이 출력된다. 이를 underflow라고 일컫는데,
// 원칙적으로는(학문적으로는) 틀렸다.
printf("%d", c2); //128이 아닌 -128이 출력된다. 이를 overflow라고 일컫는데, 맞다.
C
복사
•
학문(원칙)적 관점
정수형 변수(char, integer, 따위)에 변수의 범위보다 작은 값이 할당되어 그 값이 산수적으로 맞지 않는 상황을 underflow라고 하는 것은 학.문.적으로는 틀렸다.
원칙적으로 integer형 변수에 변수의 범위보다 크거나 작은 값이 할당되어 그 값이 산수적으로 맞지 않는 두 경우 모두를 overflow라고 한다. (정정 2023.02.03)
컴퓨터공학에서 용어 underflow는 부동소수점과 stack에서(만) 쓰인다.
- 부동소수점에서의 underflow https://en.m.wikipedia.org/wiki/Arithmetic_underflow
- stack underflow https://en.wikipedia.org/wiki/Stack_(abstract_data_type)
•
현실(현상)적 관점
※ 다만, 개발 씬(업계)에서는 동서고금을 막론하고 정수형 변수에 변수의 범위보다 작은 값이 할당되어 그 값이 산수적으로 맞지 않는 경우를 underflow, 큰 값이 할당되어 그 값이 산수적으로 맞지 않는 경우를 overflow라고 커뮤니케이션하고 있는 것이 현실이다.
참고-1) 해외 인강 사이트
참고-2) 국내 인강 사이트
※ [궁금증]
1) 그렇다면 왜 현실에서는 많은 사람들이 위 동그라미로 묘사한 것처럼 오버플로우와 언더플로우로 구분해 사용하고 있을까?
개발자 A가 개발자 B에게 ‘overflow가 발생한다’는 의사전달을 했다고 상상해보자. 의사전달을 받은 B는 이것이 표현 범위 최대를 넘어선 overflow인지, 아니면 표현범위 최소를 넘어선 overflow인지 재차 A에게 물었고 A가 이에 다시 답해야 하는 낭비적 수고가 거듭되면서 이러한 불편을 해결하기 위해 MAX를 넘은 경우를 overflow, MIN를 넘은 경우는 underflow 라고 오용이 시작됐고, 그것이 범 세계적으로 남용되면서 동서고금에 업계 전문 용어로 자리잡은 것이 아닌가 추론해본다.
2) 아니 그래도, overflow와 underflow라고 표현하는 것이 더 편리한데 왜 원칙은 MAX와 MIN을 넘는 경우 둘 다를 overflow라고만 하는가?
아래의 그림을 보면 cpu가 연산하는 과정은 사람이 생각하는 것처럼 위(over)나 아래(under)의 개념으로 이루어지지 않고, 그냥 범위를 넘치(overflow)는 것이기 때문이다.
그림 1) char형에서 최소값 -128 + (-1) = 127 이 되었다. 이렇게 보면 over(위)나 under(아래) 개념으로 표현하기에는 무리가 있다.
그림 2) char형에서 최대값 127 + 1 = -128 이 되었다. 이렇게 보면 over(위)나 under(아래) 개념으로 표현하기에는 무리가 있다.
︎ 근거
•
근거 요약
근거 1) Wikipedia
1)-① “underflow는 부동소수점 연산 관련 존재, 사용되는 용어이다.”
1)-② “integer에서 underflow라는 용어가 사용되고 있는데, 이는 오용이다. integer에서는 overflow 개념만 존재한다. int 최대값보다 크거나 int최소값보다 작은 경우 모두를 일컬어 overflow라고 한다.”
근거 2) ISO C
검색어 underflow로 검색해봐도 부동소수점 연산 관련 overflow와 underflow에 대한 언급이 있을 뿐, integer overflow나 integer underflow에 대한 언급 자체가 없다.
근거 3) 책 C programming: A Modern Approach (저자: K. N. King)
본 책에서도 integer에서 표현 범위를 벗어난 상황을 overflow라고 설명하고, underflow라는 용어는 언급조차 않는다.
근거 4) 양희재 교수(경성대 컴퓨터공학과) 블로그
양희재 교수는 본인의 블로그에 carry와 overflow의 차이를 설명하면서 -128 + (-128) = 256 를 underflow가 아닌 overflow 라고 기술했다.
근거 5) 책 CODE의 저자 찰스 펫졸드의 답변
찰스 펫졸드는 자신은 저서 CODE에서 가산기에 대해 설명하면서 삽화와 본문에서 용어 underflow를 사용했다. 그는 8비트 가산기의 계산 결과가 표현할 수 있는 범위의 최대값인 255보다 크면 overflow, 0보다 작으면 underflow라고 했는데, 그에게 underflow가 옳은 용어 사용인지 문의한 결과 (이.제.는.) 잘못된 용어 사용이고 금번 개정판에서 해당 용어를 삭제했다고 답변을 받았다.
•
정정 근거 (2023.02.03)
정정 근거 1) Linux manual page (C표준 1990년, 1999년 기준에 따른 매뉴얼)
터미널에서 함수 strtol과 함수 strtoll 의 매뉴얼에 따르면 함수의 return값에 대한 설명에서 return값이 표현 범위의 최소값 미만이면 underflow, 최대값 초과면 overflow 라고 안내하고 있는데, 이는 각각 ISO/IEC 9899:1990 (``ISO C90'') (1990년 기준), ISO/IEC 9899:1999 (``ISO C99'') (1999년 기준)에 따름이라고 그 출처를 밝히고 있다.
정정 근거 2) C표준 2007년, 2014년 개정판의 함수 strtol과 함수 strtoll의 매뉴얼
함수의 return값에 대한 설명에서 if the correct value is outside the range of representable values, LONG_MIN, LONG_MAX, LLONG_MIN, LLONG_MAX or ULLONG_MAX 로 한다고 안내하고 있다. 다시 말해, 1999년까지의 C표준에서 사용했던 최소값 미만이면 underflow, 최대값 초과면 overflow라는 안내문구를 (적어도) 2007년 C표준부터는 삭제한 것이고, 그 자리를 outside the range of representable values(표현가능한 값의 범위를 벗어난 경우)로 개정한 것이다.
•
근거 상세
근거 1)-① Arithmetic underflow (Wikipedia)
[하이라이트 번역] 정수형 변수가 표현할 수 있는 가장 작은 숫자보다 작은 숫자를 할당하는 행위(예: unsigned int형 변수에 -1을 할당하는 경우)를 overflow 또는 폭넓게는 integer wraparound라고 한다. underflow라는 용어는 보통 부동소수점 숫자를 언급할때만 쓰인다. 부동소수점 designs에서 그것이 부호화되거나 음의 무한대값을 갖는것처럼 너무 낮은 값을 저장하는 것은 불가능하다.
근거 1)-② Integer overflow (Wikipedia)
번역 : 컴퓨터 프로그래밍에서 integer overflow란? 표현할 수 있는 범위를 벗어난(최대값보다 높거나, 최소값보다 낮은) 숫자값을 만들어내는 산술 연산이 시도될 때 발생한다.
[하이라이트 번역] underflow라는 용어는 integer 계산이 아니라, 대부분 부동소수점 계산에서 사용된다. 그러나 integer underflow에 대한 많은 참고문헌들도 쉽게 찾을 수 있다.
- integer underflow라는 용어가 사용되는 예)1 : 실제 산출해야 할 결과(수학적 계산 결과)가 출력값의 자료형이 표현할 수 있는 값보다 음수 무한대에 가까운 경우.
- integer underflow라는 용어가 사용되는 예)2 : 모든 경우의 overflow를 포함하거나, 또는 실제 산출해야 할 결과(수학적 계산 결과)가 출력값의 자료형이 표현할 수 있는 값보다 양의 무한대에 가까운 경우.
근거 2) ISO C
SO C에는 부동소수점 연산 관련 overflow와 underflow에 대한 언급이 있을 뿐, integer overflow나 integer underflow에 대한 언급 자체가 없다.
근거 3) 책 C programming: A Modern Approach (저자: K. N. King)
본 책에서도 integer에서 표현 범위를 벗어난 상황을 overflow라고 설명하고, underflow라는 용어는 언급조차 않는다.
근거 4) 양희재 교수(경성대 컴퓨터공학과) 블로그
캐리(Carry)와 오버플로우(Overflow)
•
캐리 : 최상위 비트(MSB)에서 그 위의 비트로 자리올림이 발생하는 것. (캐리 자체로는 오류 발생과 관련 없음)
•
오버플로우 : 연산 결과값이 주어진 비트수로 표현될 수 있는 범위를 벗어난 것을 의미. (이것은 오류 발생을 의미)
본 블로거(경성대 컴공과 양희재 교수)는 -128 + (-128) = 256 를 underflow가 아닌 overflow 라고 서술하고 있다.
근거 5) CODE의 저자 찰스 펫졸드의 답변
찰스 펫졸드의 저서 CODE의 236쪽. 상단의 삽화에 overflow 이거나 underflow인 경우 불이 켜지는 전구 그림이 있다. 본문 중단에는 8비트 가산기의 계산 결과가 표현할 수 있는 범위의 최대값인 255보다 크면 overflow, 0보다 작으면 underflow라고 기술돼 있다.
저자 펫졸드와 번역자 김현규가 학자라서 혼란스러웠다.
“학문적으로 integer에서 underflow라는 개념이 존재하지 않는다면 왜 학자인 저자와 번역자는 저렇게 집필하고 번역하여 저자의 국가와 변역자의 국가에 출간했을까? 혹시 학문적으로도 존재하는 개념인데 아직 관련 reference를 찾아내지 못한 것은 아닐까?
게다가 이 책은 1999년에 출간되었고, 국내 번역본은 2010년, 2013년에 초판 1쇄, 3쇄 발행. 2015년, 2021년에 신판 1쇄, 6쇄 발행했다. 지금은 2023년이다. integer에서 용어 underflow를 사용하는 것이 학문적으로 틀렸다면 출간했던 1999년 이래 23년 동안 자의로든 타의로든 수정했을 가능성이 높다. 상황이 이렇다면 추론 1)과는 다르게 integer에서도 underflow가 학문적으로 존재하는 용어일 가능성을 완전 배제할 수 없다. ”
검색만으로는 한계에 이르렀다. CODE 저자 펫졸드에게 묻지 않으면 확인할 수 없다.
그래서 펫졸드에게 이메일로 물었고, 감사하게도 그가 다음과 같이 실수를 인정하는 회신을 보내왔다. (정정)→ ‘본 회신을 저자 펫졸드씨가 실수를 인정한 것이 아니라 CODE를 집필하고 출간한 1999년 즈음에는 integer에서도 underflow를 썼기 때문에 그땐 그렇게 썼던 것이고 이번 2023년 개정판에서는 바뀐 ISO C에 맞춰 해당 용어를 삭제했다는 회신을 보내온 것으로 정정합니다.’
정정 근거 1) Linux manual page (C표준 1990년, 1999년 기준에 따른 매뉴얼)
정정 근거 2) C표준 2007년, 2014년 개정판의 함수 strtol과 함수 strtoll의 매뉴얼
2-1) ISO C 2007년 개정판
2-1) ISO C 2017년 최신 개정판
-끝-
첨언
금번 underflow에 대한 탐구는 책 CODE 독서스터디 중 동료 seongtki님이 ‘underflow는 오용이다.’라는 발언을 테이블 위에 던지면서 시작됐습니다. 이 발언을 나머지 스터디 동료 6명(seongtki, chanson, jeykim, mgo, jim, kiyolee)이 ‘맞다 아니다’ 하며 뜯기 시작했고, seojin님이 overflow의 원리를 도식화한 설명이 더해지고, 저자 펫졸드씨께서 기꺼이 실수를 인정하며 응답해주셔서 이렇게 바람직한 결론에 이르게 되었습니다. 잘못 알고 있던 지식과 오용을 바로잡을 수 있도록 시너지 효과를 발휘해준 CODE 스터디 동료 여러분과 seojin님과 펫졸드씨께 감사의 마음 전합니다.
정정 후 첨언 (2023.02.03)
친애하는 동료 hyeyukim님께 감사합니다.
덕분에 잘못된 결론을 바로잡고 잘못된 지식의 확산을 최소화 할 수 있게 되었습니다.
감사합니다.