Jawaban Sparky adalah salah satu cara standar untuk mengatasi masalah ini, tetapi seperti yang saya juga tulis dalam komentar saya, Anda berisiko meluap. Ini dapat diselesaikan dengan menggunakan tipe yang lebih luas, tetapi bagaimana jika Anda ingin membagi long long
s?
Jawaban Nathan Ernst memberikan satu solusi, tetapi melibatkan pemanggilan fungsi, deklarasi variabel dan kondisional, yang membuatnya tidak lebih pendek dari kode OP dan bahkan mungkin lebih lambat, karena lebih sulit untuk dioptimalkan.
Solusi saya adalah ini:
q = (x % y) ? x / y + 1 : x / y;
Ini akan sedikit lebih cepat daripada kode OP, karena modulo dan divisi dilakukan dengan menggunakan instruksi yang sama pada prosesor, karena kompiler dapat melihat bahwa mereka setara. Setidaknya gcc 4.4.1 melakukan optimasi ini dengan flag -O2 pada x86.
Secara teori, kompiler mungkin menyejajarkan fungsi memanggil kode Nathan Ernst dan memancarkan hal yang sama, tetapi gcc tidak melakukan itu ketika saya mengujinya. Ini mungkin karena itu akan mengikat kode yang dikompilasi ke versi tunggal dari perpustakaan standar.
Sebagai catatan terakhir, semua ini tidak penting pada mesin modern, kecuali jika Anda berada dalam loop yang sangat ketat dan semua data Anda ada di register atau L1-cache. Kalau tidak, semua solusi ini akan sama cepatnya, kecuali kemungkinan Nathan Ernst, yang mungkin lebih lambat secara signifikan jika fungsinya diambil dari memori utama.
q = x/y + (x % y != 0);
cukup saja