İşte bu Microsoft Araştırma makalesine göre eski bir soruya yeni bir cevap ve buradaki referanslara .
C11 ve C ++ 11 itibaren, bir anlambilim o Not divolmuştur sıfıra doğru kesme (bakınız [expr.mul]/4). Üstelik, Dbölü d, C ++ 11 teminat bölüm ile ilgili aşağıdaki qTve geri kalanırT
auto const qT = D / d;
auto const rT = D % d;
assert(D == d * qT + rT);
assert(abs(rT) < abs(d));
assert(signum(rT) == signum(D));
signumargümanı olup olmadığına bağlı olarak, 0, -1 +1 haritalar <==,> 0 (bakınız daha bu soru-cevap kaynak kodu).
Kesik bölme ile, kalanın işareti temettü işaretine eşittirD , yani -1 % 8 == -1. C ++ 11 ayrıca std::divüyelerle quotve remkesilmiş bölüme göre bir yapı döndüren bir işlev sağlar .
Mümkün olan başka tanımlar da vardır, örneğin, sözde tabana bölünmüş bölme , yerleşik kesik bölme açısından tanımlanabilir
auto const I = signum(rT) == -signum(d) ? 1 : 0;
auto const qF = qT - I;
auto const rF = rT + I * d;
assert(D == d * qF + rF);
assert(abs(rF) < abs(d));
assert(signum(rF) == signum(d));
Tabana bölünmüş bölme ile, geri kalanın işareti bölenin işaretine eşittird . Haskell ve Oberon gibi dillerde, katlanmış bölme için yerleşik operatörler vardır. C ++ 'da, yukarıdaki tanımları kullanarak bir işlev yazmanız gerekir.
Yine başka bir yol, yerleşik kesik bölünme açısından da tanımlanabilen Öklid bölünmesidir
auto const I = rT >= 0 ? 0 : (d > 0 ? 1 : -1);
auto const qE = qT - I;
auto const rE = rT + I * d;
assert(D == d * qE + rE);
assert(abs(rE) < abs(d));
assert(signum(rE) != -1);
Öklid bölünmesi ile, geri kalanın işareti her zaman pozitiftir .