الأعداد الصحيحة هي أعداد كاملة. ليس لها جزء كسري أو عشري. وتُمثَّل في الحاسوب كنمط من البتات الثنائية.
قد تكون الأعداد الصحيحة موقّعة أو غير موقّعة. تعني كون العدد موقّعًا أن تُحجز واحدة من بتاته لتحديد ما إذا كان سالبًا أم لا.
كل الأعداد الصحيحة لها عرض بتات، وهو ببساطة عدد البتات المكوّنة للعدد. يؤثر هذا في القيمة القصوى التي يمكن أن يمثلها نوع العدد الصحيح ذاك.
على سبيل المثال، أحد أكثر أنواع الأعداد الصحيحة شيوعًا هو u8: عدد صحيح غير موقّع من 8 بتات. قد تتعرف على هذا النوع باعتباره بايت واحدًا. له قيمة دنيا تساوي 0 وقيمة قصوى تساوي 255.
تمتلك Rust 12 نوعًا بدائيًا من الأعداد الصحيحة، مصنّفة حسب عرض البتات والإشارة:
| غير موقّع | موقّع |
|---|---|
u8 |
i8 |
u16 |
i16 |
u32 |
i32 |
u64 |
i64 |
u128 |
i128 |
usize |
isize |
يُشار دائمًا إلى عرض بتات العدد الصحيح بالرقم الذي يلي u أو i. usize و isize خاصان: فلهما عرض المؤشر نفسه على الآلة الهدف. هذا يعني أنه على معمارية 64 بت، يبلغ عرض usize و isize 64 بت، لكنهما يبلغان 32 بت على معمارية 32 بت.
بشكل عام، إذا كنت تحتاج فقط إلى تمثيل عدد ما، فاستخدم i32: فـ32 بت تمتلك نطاقًا واسعًا بما يكفي بحيث يكون تجاوز السعة غير مرجح نسبيًا، كما أن الأعداد الموقّعة تحمل مفاجآت أقل من الأعداد غير الموقّعة. i32 يكافئ long في C، أو int في Java. إذا استخدمت قيمة عددية حرفية ولم تحدد النوع صراحةً، فسيكون النوع الافتراضي هو i32.
إذا كنت تعمل مع بيانات ثنائية، فالأسهل هو العمل بالبايتات: &[u8] أو Vec<u8>.
تستخدم Rust usize لحجم المجموعات وفهرستها. وذلك لأن الحاسوب لا يمكنه نظريًا عنونة أكثر من usize::MAX بايت من الذاكرة، لذا لا يمكن وجود مجموعات أكبر في الذاكرة. لذلك، قد يكون usize مفيدًا إذا كنت تقوم بالكثير من العمل مع المجموعات.
إذا كانت بياناتك لا تتسع لعدد صحيح من 32 بت، ففكّر في التوسع إلى عدد صحيح من 64 أو 128 بت. إذا كانت بياناتك لا تتسع لعدد صحيح من 128 بت، فيمكنك استخدام نوع عدد صحيح كبير مثل الذي توفره num-bigint.
الأعداد الصحيحة من 16 بت ليست شائعة جدًا، لكنها قد تكون مفيدة عند استهداف متحكمات دقيقة معينة.
إذا كنت تعلم أنه لا توجد حالات سالبة صالحة لتطبيقك، فمن الأفضل استخدام عدد صحيح غير موقّع بدلًا من عدد صحيح موقّع. العد مثال جيد على ذلك.
لا تمتلك Rust تحويلات عددية ضمنية. إذا احتجت إلى التحويل بين أنواع الأعداد الصحيحة، فهناك استراتيجيتان أساسيتان: الكلمة المفتاحية as، والسمتان From و TryFrom.
استخدام الكلمة المفتاحية as بسيط: expr as Type. ومع ذلك، هناك عدد من المحاذير والتفاصيل الدقيقة التي عليك وضعها في الاعتبار عند استخدام تحويلات as.
التحويل القائم على السمات أكثر تعقيدًا قليلًا، لكنه أكثر أمانًا: لا تُنفَّذ سمات التحويل إلا حيث تكون آمنة. على سبيل المثال، i32 يُنفّذ From<u8> و From<u16> و From<i8> و From<i16>: أي قيمة يمكن تمثيلها بأي من هذه الأنواع مضمون أنها قابلة للتمثيل في i32. يمكن استخدامه مثل i32::from(expr)، أو expr.into()، حيث ينتمي expr إلى أحد هذه الأنواع. كما يُنفّذ i32 TryFrom<u32>، و TryFrom<u64>، و TryFrom<u128>، و TryFrom<usize>، و TryFrom<i64>، و TryFrom<i128>، و TryFrom<isize>. ستنجح هذه التحويلات أو تتجاوز السعة بشكل صريح، حسب القيمة. لاستخدام هذه، ستحتاج إلى استيراد السمة std::convert::TryFrom أو std::convert::TryInto حسب الحالة، ثم استخدام i32::try_from(expr) أو expr.try_into()، حيث ينتمي expr إلى نوع مناسب.
يُفضَّل عمومًا استخدام التحويل القائم على السمات بدلًا من التحويل باستخدام as، خاصةً عند التحويل من نوع أوسع إلى نوع أضيق. التحويل القائم على السمات أغلى بشكل لا يُذكر من التحويل باستخدام as: لا يستحق استخدام as لأسباب الأداء إلا في حلقة تُنفَّذ بكثافة عالية جدًا.