<aside> 💡 🌸 special thanks to

본 정정은 2023년 2월 3일 저녁 6시경 친애하는 동료 hyeyukim님께서 본인의 과제 수행 중 리눅스 매뉴얼 페이지에 strtol 함수의 return값의 자료형이 integer계열인 long이고, return값이 표현할 수 있는 범위에서 최소값 미만인 경우 underflow, 최대값 초과인 경우 overflow로 기술됐음을 저에게 알려옴에 따라 보강 조사를 하였고 아래와 같이 결론을 정정함을 밝힙니다.

</aside>

<aside> 💡 ◼︎ 결론 정정 (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라고 서술했던 것이다.

</aside>

<aside> 💡 이하 기존 내용 중 정정 내용은 취소선을, 추가 내용은 (분홍)색처리 하였음을 알려드립니다.

</aside>

◼︎ 결론 (정정 전)

원칙적으로(학문적으로)는 1999년까지만 해도 underflow, overflow라고 했지만, 2000년 초반 C표준이 개정되면서 현재는 두 경우 모두를 ‘overflow’라고 한다.

원칙적으로(학문적으로)는 1999년까지만 해도 underflow, overflow라고 했지만, 2000년 초반 C표준이 개정되면서 현재는 두 경우 모두를 ‘overflow’라고 한다.

char c1;

c1 = -129;
c2 = 128;
printf("%d", c1); //-129가 아닌 127이 출력된다. 이를 underflow라고 일컫는데, 
									// ~~원칙적으로는(학문적으로는)~~ 틀렸다.
printf("%d", c2); //128이 아닌 -128이 출력된다. 이를 overflow라고 일컫는데, 맞다. 

◼︎ 근거

근거 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가 옳은 용어 사용인지 문의한 결과 (이.제.는.) 잘못된 용어 사용이고 금번 개정판에서 해당 용어를 삭제했다고 답변을 받았다. 

근거 1)-② Integer overflow (Wikipedia)

※ 출처 : https://en.m.wikipedia.org/wiki/Integer_overflow

번역 : 컴퓨터 프로그래밍에서 integer overflow란? 표현할 수 있는 범위를 벗어난(최대값보다 높거나, 최소값보다 낮은) 숫자값을 만들어내는 산술 연산이 시도될 때 발생한다.

번역 : 컴퓨터 프로그래밍에서 integer overflow란? 표현할 수 있는 범위를 벗어난(최대값보다 높거나, 최소값보다 낮은) 숫자값을 만들어내는 산술 연산이 시도될 때 발생한다.

![[하이라이트 번역] underflow라는 용어는 integer 계산이 아니라, 대부분 부동소수점 계산에서 사용된다. 그러나 integer underflow에 대한 많은 참고문헌들도 쉽게 찾을 수 있다.

[하이라이트 번역] underflow라는 용어는 integer 계산이 아니라, 대부분 부동소수점 계산에서 사용된다. 그러나 integer underflow에 대한 많은 참고문헌들도 쉽게 찾을 수 있다.

근거 2) ISO C

SO C에는 부동소수점 연산 관련 overflow와 underflow에 대한 언급이 있을 뿐, integer overflow나 integer underflow에 대한 언급 자체가 없다.

Screen Shot 2023-01-16 at 10.21.52 PM.png

근거 3) 책 C programming: A Modern Approach (저자: K. N. King)

본 책에서도 integer에서 표현 범위를 벗어난 상황을 overflow라고 설명하고, underflow라는 용어는 언급조차 않는다.

IMG_1113 (1).jpg

근거 4) 양희재 교수(경성대 컴퓨터공학과) 블로그

※출처 : https://blog.naver.com/hjyang0/183698525

캐리(Carry)와 오버플로우(Overflow)

근거 5) CODE의 저자 찰스 펫졸드의 답변

찰스 펫졸드의 저서 CODE의 236쪽. 상단의 삽화에 overflow 이거나 underflow인 경우 불이 켜지는 전구 그림이 있다. 본문 중단에는 8비트 가산기의 계산 결과가 표현할 수 있는 범위의 최대값인 255보다 크면 overflow, 0보다 작으면 underflow라고 기술돼 있다.

찰스 펫졸드의 저서 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에 맞춰 해당 용어를 삭제했다는 회신을 보내온 것으로 정정합니다.’

Screenshot 2023-01-21 at 10.18.31 AM.png

정정 근거 1) Linux manual page (C표준 1990년, 1999년 기준에 따른 매뉴얼)

image.png

정정 근거 2) C표준 2007년, 2014년 개정판의 함수 strtol과 함수 strtoll의 매뉴얼

2-1) ISO C 2007년 개정판

스크린샷 2023-02-03 오후 9.47.31.png

2-1) ISO C 2017년 최신 개정판

스크린샷 2023-02-03 오후 9.40.54.png

-끝-

🌸 첨언

금번 underflow에 대한 탐구는 책 CODE 독서스터디 중 동료 seongtki님이 ‘underflow는 오용이다.’라는 발언을 테이블 위에 던지면서 시작됐습니다. 이 발언을 나머지 스터디 동료 6명(seongtki, chanson, jeykim, mgo, jim, kiyolee)이 ‘맞다 아니다’ 하며 뜯기 시작했고, seojin님이 overflow의 원리를 도식화한 설명이 더해지고, 저자 펫졸드씨께서 기꺼이 실수를 인정하며 응답해주셔서 이렇게 바람직한 결론에 이르게 되었습니다. 잘못 알고 있던 지식과 오용을 바로잡을 수 있도록 시너지 효과를 발휘해준 CODE 스터디 동료 여러분과 seojin님과 펫졸드씨께 감사의 마음 전합니다.

🌸 정정 후 첨언 (2023.02.03)

친애하는 동료 hyeyukim님께 감사합니다.

덕분에 잘못된 결론을 바로잡고 잘못된 지식의 확산을 최소화 할 수 있게 되었습니다.

감사합니다.