ARM, x86 등등 아키텍처에선
정수 연산을 하고 결과값의 상태를 나타내는 상태 레지스터를 바꾸는데
그 상태들 중 하나가 오버플로우 플래그임
이전 연산에서 signed 오버플로우가 발생하면 이 비트가 켜짐
아쉽게도 C 표준에선 이걸 접근할 수가 없음
그래서 대게 오버플로우를 피하기 위해서 브랜치를 사용하는데
인라인 어셈블리를 통해 접근하는 게 가능하긴 함
여기서 반환값이 0이 아니면 오버플로우
근데 이상하게 assert로 평가하면 어셈블리가 이상하게 나오더라
https://godbolt.org/z/fGd9qnzqW
아마 최적화 문제인 거 같은데 assert말고 그냥 쓰면 잘 작동함
진짜 이렇게 쓰는 데를 본 적은 없고 그냥 이런 방법도 있다는 거임
왜 최적화 키면 push/pushf가 안되는가는 여기 잘 설명되어있네. __builtin_add_overflow 라는 함수의 존재와 seto라는 명령어가 있는지도 처음 앎
https://stackoverflow.com/a/34522750/9379639
굳이 push/pop(pull) 하지말고 lahf/sahf같은 명령어로 플래그 값 받아온 다음에 이 값을 변수에다 옮기는 방법이 있지 않을까