Sparky의 대답은이 문제를 해결하는 하나의 표준 방법이지만 내 의견에 썼 듯이 오버플로의 위험이 있습니다. 더 넓은 유형을 사용하면이 문제를 해결할 수 있지만 long long
s 를 나누려면 어떻게해야 합니까?
Nathan Ernst의 답변은 하나의 솔루션을 제공하지만 함수 호출, 변수 선언 및 조건부와 관련이 있습니다. 이는 OPs 코드보다 짧지 않으며 최적화하기가 더 어려워 아마도 느릴 수 있습니다.
내 해결책은 이것입니다 :
q = (x % y) ? x / y + 1 : x / y;
모듈로와 나누기는 프로세서에서 동일한 명령을 사용하여 수행되기 때문에 OPs 코드보다 약간 빠릅니다. 컴파일러는 이들이 동등한 것을 알 수 있기 때문입니다. 적어도 gcc 4.4.1은 x86에서 -O2 플래그를 사용하여이 최적화를 수행합니다.
이론적으로 컴파일러는 Nathan Ernst의 코드에서 함수 호출을 인라인하고 동일한 것을 방출 할 수 있지만 gcc는 테스트 할 때 그렇게하지 않았습니다. 컴파일 된 코드를 단일 버전의 표준 라이브러리에 연결하기 때문일 수 있습니다.
마지막으로, 매우 엄격한 루프 상태에 있고 모든 데이터가 레지스터 또는 L1 캐시에있는 경우를 제외하고는 최신 머신에서는이 문제가 중요하지 않습니다. 그렇지 않으면 Nathan Ernst를 제외하고 이러한 모든 솔루션이 똑같이 빠를 것입니다.이 기능은 주 메모리에서 함수를 가져와야하는 경우 상당히 느려질 수 있습니다.
q = x/y + (x % y != 0);
충분합니다