div, ldiv, lldiv, imaxdiv
| معرفة في ملف <stdlib.h>
|
||
div_t div( int x, int y ); |
(1) | |
ldiv_t ldiv( long x, long y ); |
(2) | |
lldiv_t lldiv( long long x, long long y ); |
(3) | (منذ C99) |
| معرفة في ملف <inttypes.h>
|
||
imaxdiv_t imaxdiv( intmax_t x, intmax_t y ); |
(4) | (منذ C99) |
تحسب خارج (quotient) وباقي (remainder) قسمة البسط x على المقام y.
|
تحسب خارج وباقي القسمة بالتوازي. خارج القسمة هو الخارج الجبري بعد ازالة أي فواصل عشرية (أي أن التقريب تجاه الصفر). باقي القسمة يحقق المعادلة |
(حتى C99) |
|
تحسب خارج القسمة (أي نتيجة العملية |
(منذ C99) |
المعطيات
| x, y | - | أعداد صحيحة |
القيمة المُرجعة
طالما يمكن تمثيل باقي وناتج القسمة ككائنين من النوع المناسب (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
انظر أيضا
(C99)(C99) |
تحسب باقي عملية قسمة لأعداد فاصلة عائمة (float) (دالة) |
(C99)(C99)(C99) |
تحسب باقي قسمة ذو إشارة لعددين ذوي فاصلة عائمة (دالة) |
(C99)(C99)(C99) |
تحسب باقي قسمة ذو إشارة بالإضافة إلى آخر 3 بت من ناتج القسمة (دالة) |
مقالة مرجع C++ عن div
| |