---
id: "imported/blog/viewings/miscellaneous/mistake"
title: "오답노트"
description: "알게 모르게 정말 추상화란 강력한 힘을 부여한다. 특히 컴퓨터의 경우 low level에서는 트랜지스터가 작동하고 있다는 사실을 알아채기 정말 어렵다. 그리고 low level은 다 챙기기엔 귀찮기도 하고 개발하기에 시간도 많이 소요되고.."
kind: "record"
published: "2023-05-12T00:00:00.000Z"
tags: []
url: "https://www.readiz.com/blog/viewings/miscellaneous/mistake/"
markdownUrl: "https://www.readiz.com/blog/viewings/miscellaneous/mistake/index.md"
---

# 오답노트

## Low level

알게 모르게 정말 추상화란 강력한 힘을 부여한다. 특히 컴퓨터의 경우 low level에서는 트랜지스터가 작동하고 있다는 사실을 알아채기 정말 어렵다. 그리고 low level은 다 챙기기엔 귀찮기도 하고 개발하기에 시간도 많이 소요되고..

나도 `javascript`와 같이 효율적으로 구현하는 high level의 개발을 선호하는 편이지만, low level까지 알지 못한다면 가끔씩 이해하기 어려운 문제를 발견했을 때 쉽게 눈치채기 어렵다.

오늘 저지른 실수 한가지를 공유해본다.

```cpp
for (unsigned int i = 0; i <= 0xFFFFFFFFU; ++i) {
    validation(i);
}
```

위 로직은 작성자가 의도한 바에 따르면 `0` 에서 `0xFFFFFFFFU` 까지 루프를 돌고 종료될 것이다. 과연 그럴까?

문제가 되는 지점은 `0xFFFFFFFFU` 다음의 숫자이다. `0xFFFFFFFFU` 다음의 숫자가 무엇일까? 여기서 아차 싶었다. 나도 모르게 `for` 문을 추상화 해서 생각하고 있었던 것. 사실 위 로직은 `i` 라는 변수를 지속적으로 업데이트 하면서 비교를 하고 있을 따름이다.

`overflow`가 일어나기 때문에 `0xFFFFFFFFU + 1U = 0` 이다. 즉, 위 루프는 얼핏 보면 약 42억번 동작할 것 같지만, 무한루프에 빠진다. 잠시나마 골머리 썩혔던 문제고, 알고나면 별 문제 아닌데, 알고나면 김샌다. 이런 일 없도록 low level의 공부를 게을리 해서는 안될 거 같다.

## 내실을 다지자

상위 알고리즘을 푼다고 해서 자동적으로 모든 알고리즘을 아는 것은 아니다. 최근에도 `MST` 라는 것의 개념을 처음 접했고(이름은 들어봤다 했을지라도), 그래프에서의 `cycle`을 어떻게 쉽게 판정하는지도 알게 됐다. `Union Find`의 첫 활용 예를 알게 됐다고 해야하나.. 개발을 좋아하기 때문에 구현 문제에 강한 느낌인데 이것 말고도 다 잘해야 한다. 그것이 프로니까.. (오글오글)
