div, ldiv, lldiv, imaxdiv
<stdlib.h>
<inttypes.h>
تحسب خارج (quotient) وباقي (remainder) قسمة البسط x
على المقام y
.
تحسب خارج وباقي القسمة بالتوازي. خارج القسمة هو الخارج الجبري بعد ازالة أي فواصل عشرية (أي أن التقريب تجاه الصفر). باقي القسمة يحقق المعادلة quot * y + rem == x.
(حتى C99)تحسب خارج القسمة (أي نتيجة العملية x/y) وباقي القسمة (نتيجة العملية x%y) بالتوازي.
(منذ C99)محتويات
[تعديل] المعطيات
[تعديل] القيمة المُرجعة
طالما يمكن تمثيل باقي وناتج القسمة ككائنين من النوع المناسب (int و long و long long و imaxdiv_t على التوالي) يتم ارجاع كائن من النوع div_t
وldiv_t
وlldiv_t
وimaxdiv_t
معرفات كالآتي:
div_t
struct div_t { int quot; int rem; };
أو
struct div_t { int rem; int quot; };
ldiv_t
struct ldiv_t { long quot; long rem; };
أو
struct ldiv_t { long rem; long quot; };
lldiv_t
struct lldiv_t { long long quot; long long rem; };
أو
struct lldiv_t { long long rem; long long quot; };
imaxdiv_t
struct imaxdiv_t { intmax_t quot; intmax_t rem; };
أو
struct imaxdiv_t { intmax_t rem; intmax_t quot; };
في حالة أن باقي أو ناتج القسمة لا يمكن تمثيله يكون السلوك غير معرف.
[تعديل] ملحوظات
حتى معيار C99 كان اتجاه تقريب الناتج واشارة الباقي سلوك تقرره البيئة المستخدمة (implementation-defined behavior) في حالة أن أحد معاملات القسمة عدد سالب. أما في div
وldiv
فسلوك التعامل مع الأعداد السالبة واحد بغض النظر عن البيئة.
الكثير من المعالجات تقوم بحساب كلا من الناتج والباقي عند تنفيذ عملية القسمة وذلك في نفس الخطوة (أمر واحد فقط في لغة الآلة). باستخدام هذه الدالة يمكن الاستفادة من هذه الخاصية لكن الكومبيلرات الحديثة عادة ماتكون قادرة على دمج عمليات ال / وال % المتجاورة من تلقاء نفسها.
[تعديل] مثال
#include <stdio.h> #include <math.h> #include <stdlib.h> // فقط للتوضيح. احذر: لا يتم التأكد من عدم حدوث // overflow void itoa(int n, int base, char* buf) { div_t dv = {.quot = n}; char* p = buf; do { dv = div(dv.quot, base); *p++ = "0123456789abcdef"[abs(dv.rem)]; } while(dv.quot); if(n<0) *p++ = '-'; *p-- = '0円'; while(buf < p) { char c = *p; *p-- = *buf; *buf++ = c; } // عكس } int main(void) { char buf[100]; itoa(12346, 10, buf); printf("%s\n", buf); itoa(-12346, 10, buf); printf("%s\n", buf); itoa(65535, 16, buf); printf("%s\n", buf); }
الخرج:
12346 -12346 ffff