티스토리 뷰
C++을 사용하다 보면 중간 값을 구하는 연산으로 흔히들 아래와 같이 쓴다
mid = (l + r ) / 2;
mid = (left + right) / 2;
// 또는
mid = (start + end) / 2;
가끔 다른 사람들이 짜 놓은 소스코드를 보면 아래와 같이 돼있는 걸 본적이 있다.
mid = l + (r - l) / 2;
mid = left + (right - left) / 2;
mid = start + (end - start) / 2;
수학적으로는 전혀 차이가 없는데 저렇게 나누는 이유는?
Overflow 때문이다.
변수들이 int로 선언된 경우,
left + right가 INT_MAX를 넘어서는 경우 overflow가 일어나서 원하는 결과대로 수행이 되질 않는다.
따라서 최소한의 방어벽을 치기 위해 l + (r - 1)/2 와 같은 형태로 구현한다.
'Language > C C++' 카테고리의 다른 글
Visual Studio Code에서 C/C++ 컴파일 하기 (0) | 2018.03.04 |
---|---|
[C++] 2차원 배열의 포인터. 배열은 포인터 상수다. (5) | 2011.03.24 |
[C++] Double Pointer에 관하여. 동적 배열에 관하여. (1) | 2011.03.17 |
[C++] class를 주고 받을땐 레퍼런스를 사용하자. (0) | 2011.01.28 |
[C++] 분기문을 싫어하는 나같은 사람에겐.. (0) | 2010.11.30 |
[C++] RTTI와 vtable 그리고 RTCI (0) | 2010.11.25 |
[C++] dynamic_cast, const_cast, reinterpret_cast, static_cast (2) | 2010.11.24 |
[C++] 멤버 변수에서 생성자를 가진 변수 만들기 (0) | 2010.10.06 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- Troubleshooting
- 프로그래밍
- C
- 드라이버
- source
- MFC
- jni
- linux
- database
- java
- android
- 리눅스
- Python
- driver
- algorithm
- db
- 안드로이드
- winapi
- Quiz
- kering
- Visual C++
- gcc
- API
- NDK
- AWS
- it
- 음악
- C++
- Cloud
- jni강좌
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함