توفر C#، شأنها شأن كثير من اللغات ذات الأنواع الساكنة، عددًا من الأنواع التي تمثل الأعداد الصحيحة، ولكل منها نطاق قيمه الخاص. في الطرف الأدنى، يمتلك النوع sbyte قيمة صغرى مقدارها -128 وقيمة عظمى مقدارها 127. وكما هو الحال مع جميع أنواع الأعداد الصحيحة، تتوفر هاتان القيمتان على هيئة <type>.MinValue و<type>.MaxValue. وفي الطرف الأعلى، يمتلك النوع long قيمة صغرى مقدارها -9,223,372,036,854,775,808 وقيمة عظمى مقدارها 9,223,372,036,854,775,807. وبينهما يقع النوعان short وint.
ويقترن كل نوع من الأنواع المذكورة أعلاه بنظير غير مُوقَّع: sbyte/byte، وshort/ushort، وint/uint، وlong/ulong. وفي جميع الحالات يتراوح نطاق القيم من 0 إلى ضعف القيمة العظمى للمُوقَّع السالبة زائد 1.
تُمثَّل قيم الأنواع الصحيحة غير المُوقَّعة بتمثيل بسيط بالأساس 2. أما قيم الأنواع المُوقَّعة فتستخدم تمثيل الأعداد المُوقَّعة بالمتمم الثنائي.
يعكس تعدد أنواع الأعداد الصحيحة معماريات الآلات: حجم السجلات، وحجم وسائط تعليمات المعالج، ومعالجة الإشارة داخل المعالج. فقيمة من النوع long تستخدم 64 بت، بينما قيمة من النوع sbyte تستخدم 8 بت. وفي بعض الحالات ستكون هناك تأثيرات على أداء المعالج واستهلاك الذاكرة وحتى استهلاك القرص (حيث يكون اختيار نوع صحيح أصغر مفيدًا عمومًا). كما يمكن أن يكون اختيار type للأعداد الصحيحة وسيلة تقريبية بسيطة لإخبار المطورين الآخرين بنطاق القيم المتوقَّع. ويُستخدم النوع int على نطاق واسع كنوع افتراضي حين لا يكون هناك ما يستدعي شيئًا خاصًا في الاستخدام المعيّن. ويُستخدم long أو ulong على نطاق واسع كمعرّف بسيط. ويحدد حجم النوع بالبايت نطاق القيم.
الأنواع التي ناقشناها حتى الآن هي أنواع أولية. ويقترن كل منها باسم مستعار من نوع struct يُنفّذ حقولًا (مثل MinValue) وطرقًا (مثل ToString()) مرتبطة بالنوع.
| النوع | البنية | العرض | القيمة الصغرى | القيمة العظمى |
|---|---|---|---|---|
sbyte |
SByte |
8 بت | -128 | +127 |
short |
Int16 |
16 بت | -32_768 | +32_767 |
int |
Int32 |
32 بت | -2_147_483_648 | +2_147_483_647 |
long |
Int64 |
64 بت | -9_223_372_036_854_775_808 | +9_223_372_036_854_775_807 |
byte |
Byte |
8 بت | 0 | +255 |
ushort |
UInt16 |
16 بت | 0 | +65_535 |
uint |
UInt32 |
32 بت | 0 | +4_294_967_295 |
ulong |
UInt64 |
64 بت | 0 | +18_446_744_073_709_551_615 |
يمكن تحويل متغير (أو تعبير) من نوع ما إلى نوع آخر بسهولة. على سبيل المثال، في عملية إسناد، إذا كان نوع القيمة المُسنَدة (الطرف الأيمن) يضمن أن القيمة ستقع ضمن نطاق النوع المُسنَد إليه (الطرف الأيسر)، فإن الإسناد يكون بسيطًا:
ulong ul;
uint ui = uint.MaxValue;
ul = ui; // no problem
ومن ناحية أخرى، إذا لم يكن نطاق النوع المُسنَد منه مجموعة جزئية من نطاق قيم النوع المُسنَد إليه، فإن عملية التحويل () تكون مطلوبة حتى لو كانت القيمة المعيّنة تقع ضمن نطاق النوع المُسنَد إليه:
uint ui;
short s = 42;
ui = (uint)s;
في المثال أعلاه، إذا كانت القيمة تقع بدلًا من ذلك خارج نطاق النوع المُسنَد إليه، فسيحدث تجاوز سعة. انظر overflow.
وتتحدد الحاجة إلى التحويل بالنوعين المعنيين لا بقيمة معيّنة.
تناقش الفقرات التالية تحويل الأنواع الصحيحة. ويقدّم (انظر casting) مناقشة أوسع للتحويل وتحويل الأنواع. راجع تلك الوثائق لمناقشة التحويل بين الأنواع الصحيحة والأعداد ذات الفاصلة العائمة وchar وbool.
نظام الأنواع في C# أكثر صرامة إلى حد ما من نظام C أو JavaScript، ونتيجة لذلك تكون عمليات التحويل أكثر تقييدًا. يحدث التحويل الضمني بين نوعين عدديين ما دام النوع الهدف قادرًا على الحفاظ على المقياس والإشارة لقيمة النوع المصدر.
ولا تدلّ على التحويل الضمني أي صياغة خاصة.
حين يتعذّر تحويل الأنواع العددية ضمنيًا، يمكنك عمومًا استخدام العامل الخاص بالتحويل الصريح.
وحين يتعذّر تمثيل القيمة التي يجري تحويلها بالنوع الهدف لأنه غير عريض بما يكفي أو لأنه يوجد تعارض في الإشارة، فقد يُطرح استثناء تجاوز السعة.
int largeInt = Int32.MaxValue;
int largeNegInt = Int32.MinValue;
ushort shortUnsignedInt = ushort.MaxValue;
// implicit cast
int from_ushort = shortUnsignedInt; // 65535
float from_int = largeInt; // -21474836E+09
// explicit cast
uint from_largeInt = (uint)largeInt; // 2147483647
uint from_neg = (uint) largeNegInt; // 2147483648 or OverflowException is thrown (if checked)
يوفّر الصنف BitConverter وسيلة ملائمة لتحويل أنواع الأعداد الصحيحة إلى مصفوفات من البايتات ومنها.