우선 overflow는 다들 알거라고 생각한다.
예를 들어 4바이트의 크기를 가지는 정수 자료형인 경우 2^31 - 1 에서 1을 더하면 -(2^31)로 바뀌는 뭐 그런 현상들이다.
그러나 한글로 구글링을 좀 해보면 -(2^31) - 1이 2^31 - 1로 변하는 현상을 underflow라고 지칭하는 경우를 매우 많이 보게 된다. 즉 음수값이 절대값 max를 넘기면 양수가 되는 현상을 underflow라고 소개하는 포스팅이 많다. (영문으로 검색하면 제대로 된 정의를 찾을 수 있다)
이에 아래와 같이 밝혀둔다.
1. 정확히는 상한 뿐 아니라 하한을 넘겨서 반대쪽 값이 나오는 경우도 모두 overflow이다. 정수나 unsigned 자료형에서 하한 max값을 넘어서 반대쪽 값이 나오는 현상이라고 해서 underflow가 아니다.
2. IEEE 754의 부동소수점 기술표준에 의하면 부동소수점으로 표현할 수 없는 절대값이 매우 작은 값을 표현하려 할 때 -0 혹은 +0으로 표현되는 현상(단, 두 경우 모두 부호 없이 0으로 표기된다)이 underflow이다.
3. 그게 그거 아니냐고 생각할 수 있는데, 정수 산술계산중에 캐리가 올라가서 반대쪽 값이 튀어나오는거랑 부동소수점에서 표현할 수 없는 절대값이 아주 작은 값을 0으로 고정해버리는 동작은 절대 같다고 볼 수 없다. 따라서 구분짓는게 옳다.
4. 영어로는 arithmetic underflow를 underflow라고 부른다. 하지만 정수나 unsigned 자료형에서 하한 max값을 넘어서 반대쪽 값이 나오는 경우에 underflow라는 명칭을 붙이고 싶은 경우 integer underflow라고 부르기도 하는 것 같다.
사실 뜻은 통하니까 실제로 잘못 말하는 사람이 있어도 그러려니 하고 넘어가긴 한다. 하지만 용례는 용례고, 정확한 정의는 짚고 넘어가는게 옳으니 대충이나마 설명해서 써둔다. 전공자라면 논리회로 강의 초반에 다뤄지는 내용이니 되새겨보자.
'프로그래밍 기타' 카테고리의 다른 글
Arm thumb mode (16bit)에서 stack pointer randomize하기 (0) | 2022.01.12 |
---|