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
.
تحسب خارج وباقي القسمة بالتوازي. خارج القسمة هو الخارج الجبري بعد ازالة أي فواصل عشرية (أي أن التقريب تجاه الصفر). باقي القسمة يحقق المعادلة quot * y + rem == x. |
(حتى C99) |
تحسب خارج القسمة (أي نتيجة العملية x/y) وباقي القسمة (نتيجة العملية x%y) بالتوازي. |
(منذ 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
|