في لغة C# (وغيرها من لغات البرمجة منخفضة المستوى نسبيًا)، تخزين البيانات يتم على مستوى الـ binary representation داخل الذاكرة. كل نوع بيانات (data type) يتم تخزينه بتنسيق معين يحدد عدد البتات المستخدمة وما إذا كانت هناك بتات مخصصة لعلامة الإشارة (sign) أم لا.
1. مفهوم الإشارة (Sign Bit):
عندما نتحدث عن الأرقام الصحيحة (integers)، يمكن أن تكون (signed) أو (unsigned):
- موقعة (Signed): يمكن أن تأخذ الأرقام قيمًا موجبة أو سالبة.
- غير موقعة (Unsigned): تأخذ فقط قيمًا موجبة.
البت المخصص للإشارة:
- في الأرقام الموقعة (Signed)، يتم تخصيص بت واحد (عادةً أول بت من اليسار) لتحديد الإشارة:
- 0 تعني الرقم موجب.
- 1 تعني الرقم سالب.
على سبيل المثال، لنوع البيانات int (4 بايت = 32 بت):
- القيم الموجبة يتم تمثيلها كما هي.
- القيم السالبة يتم تمثيلها باستخدام تقنية Two’s Complement.
Two’s Complement:
تقنية تُستخدم لتمثيل الأرقام السالبة. الفكرة هي أن يتم قلب البتات كلها للرقم الموجب وإضافة 1. هذا النظام يجعل العمليات الحسابية أسهل لأن نفس الدوائر الحسابية تُستخدم للأرقام الموجبة والسالبة.
3. أمثلة عملية:
3.1. عدد (Signed):
int x = -5;
// يتم تخزين القيمة باستخدام Two's Complement
// البت الأول (من اليسار) = 1 -> الرقم سالب3.2. عدد (Unsigned):
uint y = 5;
// كل البتات تُستخدم لتمثيل الرقم نفسه لأنه دائمًا موجب4. تفاصيل إضافية:
- بالنسبة للـ floating-point types (مثل
floatوdouble)، هناك بتات مخصصة للإشارة، والقيمة الأسية (exponent)، والقيمة الفعلية (mantissa) وفقًا لمعيار IEEE 754. - الأنواع المرجعية (Reference Types) مثل الكائنات (Objects) لا تتبع نفس الطريقة لأنها تخزن إشارات مرجعية (references) في الذاكرة.