يمكن النظر إلى الأنواع على أنها قوالب للقيم، وإلى القيم على أنها نسخ من الأنواع. ستقدّم هذه المقالة الأنواع الأساسية المدمجة وقيمها الحرفية في Go. لن تُقدَّم الأنواع المركّبة في هذه المقالة.
الأنواع الأساسية المدمجة في Go
تدعم Go الأنواع الأساسية المدمجة التالية:
- نوع منطقي مدمج واحد:
bool. - 11 نوعًا عدديًا صحيحًا مدمجًا (أنواع الأعداد الصحيحة الأساسية):
int8،uint8،int16،uint16،int32،uint32،int64،uint64،int،uint، وuintptr. - نوعان عدديان عشريان مدمجان:
float32وfloat64. - نوعان عدديان مركّبان مدمجان:
complex64وcomplex128. - نوع نصي مدمج واحد:
string.
ينتمي كل نوع من الأنواع الأساسية المدمجة السبعة عشر إلى صنف مختلف من الأنواع في Go. يمكنك استخدام الأنواع المدمجة أعلاه في الشيفرة دون استيراد أي حزم، مع أن جميع أسماء هذه الأنواع معرّفات غير مُصدَّرة.
خمسة عشر نوعًا من الأنواع الأساسية المدمجة السبعة عشر هي أنواع عددية. تشمل الأنواع العددية أنواع الأعداد الصحيحة والأنواع العشرية والأنواع المركّبة.
تدعم Go أيضًا اسمين مستعارين مدمجين للنوع،
byteاسم مستعار مدمج لـuint8. يمكنك اعتبارbyteوuint8النوع نفسه.runeاسم مستعار مدمج لـint32. يمكنك اعتبارruneوint32النوع نفسه.
أنواع الأعداد الصحيحة التي تبدأ أسماؤها بحرف u هي أنواع غير مُوقَّعة. قيم الأنواع غير المُوقَّعة غير سالبة دائمًا. الرقم في اسم النوع يعني عدد البتات الثنائية التي ستشغلها قيمة من هذا النوع في الذاكرة وقت التشغيل. مثلًا، تشغل كل قيمة من النوع uint8 ثمانية بتات في الذاكرة. لذا فإن أكبر قيمة لـ uint8 هي 255 (28-1)، وأكبر قيمة لـ int8 هي 127 (27-1)، وأصغر قيمة لـ int8 هي -128 (-27).
إذا شغلت قيمة ما N بت في الذاكرة، نقول إن حجم القيمة هو N بت. أحجام جميع قيم النوع الواحد متساوية دائمًا، لذا كثيرًا ما تُسمى أحجام القيم أحجام الأنواع.
نقيس عادةً حجم القيمة بعدد البايتات التي تشغلها في الذاكرة. يحتوي البايت الواحد على 8 بتات. لذا فإن حجم النوع uint32 هو أربعة بايتات.
أحجام قيم uintptr وint وuint في الذاكرة تعتمد على التطبيق (implementation). عمومًا، حجم قيم int وuint هو 4 بايتات على معماريات 32 بت، و8 بايتات على معماريات 64 بت. ويجب أن يكون حجم قيمة uintptr كبيرًا بما يكفي لتخزين البتات غير المفسَّرة لأي عنوان ذاكرة.
الجزءان الحقيقي والتخيلي لقيمة complex64 كلاهما من قيم float32، والجزءان الحقيقي والتخيلي لقيمة complex128 كلاهما من قيم float64.
في الذاكرة، تُخزَّن جميع القيم العددية العشرية في Go بصيغة IEEE-754.
تمثّل القيمة المنطقية قيمة صدق. لا توجد في الذاكرة سوى قيمتين منطقيتين ممكنتين، ويُشار إليهما بالثابتين المُسمَّيين المُعرَّفين مسبقًا false وtrue. ستُقدَّم الثوابت المُسمَّاة في المقالة التالية.
منطقيًا، تدل القيمة النصية على قطعة من النص. وفي الذاكرة، تخزّن القيمة النصية تسلسلًا من البايتات، وهو تمثيل ترميز UTF-8 لقطعة النص التي تدل عليها القيمة النصية. يمكنك معرفة المزيد عن النصوص من مقالة النصوص في Go لاحقًا.
مع أنه لا يوجد سوى نوع مدمج واحد لكل من الأنواع المنطقية والأنواع النصية، يمكننا تعريف أنواع منطقية وأنواع نصية مخصّصة انطلاقًا من النوعين المنطقي والنصي المدمجين. لذا يمكن أن توجد أنواع منطقية وأنواع نصية كثيرة. والأمر نفسه ينطبق على أي صنف من الأنواع العددية. فيما يلي بعض أمثلة تعريف الأنواع. في هذه التعريفات، الكلمة type كلمة مفتاحية.
/* بعض تعريفات الأنواع */
// status و bool نوعان مختلفان.
type status bool
// MyString و string نوعان مختلفان.
type MyString string
// Id و uint64 نوعان مختلفان.
type Id uint64
// real و float32 نوعان مختلفان.
type real float32
/* بعض تعريفات الأسماء المستعارة للأنواع */
// boolean و bool يدلان على النوع نفسه.
type boolean = bool
// Text و string يدلان على النوع نفسه.
type Text = string
// U8 و uint8 و byte تدل على النوع نفسه.
type U8 = uint8
// char و rune و int32 تدل على النوع نفسه.
type char = rune
يمكننا تسمية النوع المخصّص real المعرَّف أعلاه والنوع المدمج float32 كليهما نوعي float32. لاحظ أن كلمة float32 الثانية في الجملة السابقة إشارة عامة، في حين أن الأولى إشارة محدَّدة. وبالمثل، MyString وstring نوعا نص، وstatus وbool نوعا bool، وهكذا.
يمكنك معرفة المزيد عن الأنواع المخصّصة في مقالة نظرة عامة على نظام الأنواع في Go لاحقًا.
القيم الصفرية
لكل نوع قيمة صفرية. يمكن النظر إلى القيمة الصفرية للنوع على أنها القيمة الافتراضية له.
- القيمة الصفرية للنوع المنطقي هي false.
- القيمة الصفرية للنوع العددي هي صفر، مع أن أصفار الأنواع العددية المختلفة قد تكون لها أحجام مختلفة في الذاكرة.
- القيمة الصفرية للنوع النصي هي نص فارغ.
القيم الحرفية الأساسية
القيمة الحرفية (literal) لأي قيمة هي تمثيل نصي لتلك القيمة في الشيفرة. وقد يكون للقيمة الواحدة العديد من القيم الحرفية. تُسمى القيم الحرفية التي تدل على قيم الأنواع الأساسية القيم الحرفية الأساسية.
القيم الحرفية المنطقية
لا تعرّف مواصفة Go قيمًا حرفية منطقية. لكن في البرمجة عمومًا، يمكننا اعتبار المعرّفين المُعرَّفين مسبقًا false وtrue قيمتين حرفيتين منطقيتين. غير أنه ينبغي أن تعلم أن الاثنين ليسا قيمتين حرفيتين بالمعنى الدقيق.
كما ذُكر أعلاه، يُشار إلى القيم الصفرية للأنواع المنطقية بالثابت false المُعرَّف مسبقًا.
القيم الحرفية للأعداد الصحيحة
هناك أربع صيغ للقيم الحرفية للأعداد الصحيحة: الصيغة العشرية (الأساس 10)، والصيغة الثمانية (الأساس 8)، والصيغة الست عشرية (الأساس 16)، والصيغة الثنائية (الأساس 2). مثلًا، القيم الحرفية الأربع التالية للأعداد الصحيحة كلها تدل على 15 في النظام العشري.
0xF // الصيغة الست عشرية (تبدأ بـ "0x" أو "0X")
0XF
017 // الصيغة الثمانية (تبدأ بـ "0" أو "0o" أو "0O")
0o17
0O17
0b1111 // الصيغة الثنائية (تبدأ بـ "0b" أو "0B")
0B1111
15 // الصيغة العشرية (تبدأ بدون "0")
(ملاحظة: الصيغة الثنائية والصيغة الثمانية التي تبدأ بـ 0o أو 0O مدعومتان منذ Go 1.13.)
سيطبع البرنامج التالي نصين true.
package main
func main() {
println(15 == 017) // true
println(15 == 0xF) // true
}
لاحظ أن علامتي == هما معامل المقارنة «يساوي» (equal-to)، وسيُقدَّم في المعاملات الشائعة.
عمومًا، يُشار إلى القيم الصفرية للأنواع الصحيحة بالقيمة الحرفية 0، مع وجود قيم حرفية قانونية أخرى كثيرة للصفر الصحيح، مثل 00 و0x0. في الواقع، القيم الحرفية الصفرية التي ستُقدَّم في هذه المقالة لأنواع عددية أخرى يمكنها أيضًا تمثيل القيمة الصفرية لأي نوع صحيح.
القيم الحرفية للأعداد العشرية
قد تحتوي القيمة الحرفية العشرية للعدد العشري على جزء صحيح عشري، وفاصلة عشرية، وجزء كسري عشري، وجزء أُسّي صحيح (أساسه 10). يبدأ هذا الجزء الأُسّي بالحرف e أو E ويُتبع بقيمة حرفية عشرية صحيحة (xEn تكافئ x مضروبًا في 10n، وxE-n تكافئ x مقسومًا على 10n). بعض الأمثلة:
1.23
01.23 // == 1.23
.23
1.
// حرف "e" أو "E" يبدأ الجزء الأُسّي (أساسه 10).
1.23e2 // == 123.0
123E2 // == 12300.0
123.E+2 // == 12300.0
1e-1 // == 0.1
.1e0 // == 0.1
0010e-2 // == 0.1
0e+5 // == 0.0
منذ Go 1.13، تدعم Go أيضًا صيغة أخرى للقيم الحرفية العشرية: صيغة العدد العشري الست عشري (hexadecimal floating-point).
- يجب أن تنتهي القيمة الحرفية للعدد العشري الست عشري بجزء أُسّي أساسه 2، يبدأ بالحرف
pأوPويُتبع بقيمة حرفية عشرية صحيحة (yPnتكافئyمضروبًا في2n، وyP-nتكافئyمقسومًا على2n). - مثل القيم الحرفية الست عشرية للأعداد الصحيحة، يجب أن تبدأ القيمة الحرفية للعدد العشري الست عشري أيضًا بـ
0xأو0X. وعلى خلاف القيم الحرفية الست عشرية للأعداد الصحيحة، قد تحتوي القيمة الحرفية للعدد العشري الست عشري على فاصلة جذرية وجزء كسري ست عشري.
فيما يلي بعض القيم الحرفية القانونية للأعداد العشرية الست عشرية:
0x1p-2 // == 1.0/4 = 0.25
0x2.p10 // == 2.0 * 1024 == 2048.0
0x1.Fp+0 // == 1+15.0/16 == 1.9375
0X.8p1 // == 8.0/16 * 2 == 1.0
0X1FFFP-16 // == 0.1249847412109375
غير أن ما يلي غير قانوني:
0x.p1 // المانتيسا (mantissa) بلا أرقام
1p-2 // الأُس p يتطلب مانتيسا ست عشرية
0x1.5e-2 // المانتيسا الست عشرية تتطلب الأُس p
ملاحظة: القيمة الحرفية التالية قانونية، لكنها ليست قيمة حرفية لعدد عشري. إنها في الواقع تعبير حسابي طرح. الحرف e فيها يعني 14 في النظام العشري. 0x15e قيمة حرفية ست عشرية لعدد صحيح، و- معامل الطرح، و2 قيمة حرفية عشرية لعدد صحيح. (ستُقدَّم المعاملات الحسابية في مقالة المعاملات الشائعة.)
0x15e-2 // == 0x15e - 2 // تعبير طرح
القيم الحرفية القياسية للقيمة الصفرية للأنواع العشرية هي 0.0، مع وجود قيم حرفية قانونية أخرى كثيرة، مثل 0. و.0 و0e0 و0x0p0 وغيرها. في الواقع، القيم الحرفية الصفرية التي ستُقدَّم في هذه المقالة لأنواع عددية أخرى يمكنها أيضًا تمثيل القيمة الصفرية لأي نوع عشري.
القيم الحرفية التخيلية
تتكون القيمة الحرفية التخيلية من قيمة حرفية عشرية أو صحيحة والحرف الصغير i. أمثلة:
1.23i
1.i
.23i
123i
0123i // == 123i (للتوافق مع الإصدارات السابقة. انظر أدناه.)
1.23E2i // == 123i
1e-1i
011i // == 11i (للتوافق مع الإصدارات السابقة. انظر أدناه.)
00011i // == 11i (للتوافق مع الإصدارات السابقة. انظر أدناه.)
// السطور التالية لا تُصرَّف بنجاح إلا منذ Go 1.13.
0o11i // == 9i
0x11i // == 17i
0b11i // == 3i
0X.8p-0i // == 0.5i
لاحظ أنه قبل Go 1.13، كان الحرف i في القيمة الحرفية التخيلية لا يُسبَق إلا بقيمة حرفية عشرية. وللتوافق مع الإصدارات الأقدم، منذ Go 1.13، ما زالت القيم الحرفية الصحيحة الظاهرة بصيغة الأعداد الصحيحة الثمانية التي لا تبدأ بـ 0o و0O تُعتبر قيمًا حرفية عشرية، مثل 011i و0123i و00011i في المثال أعلاه.
تُستخدم القيم الحرفية التخيلية لتمثيل الأجزاء التخيلية من القيم المركّبة. إليك بعض القيم الحرفية التي تدل على قيم مركّبة:
1 + 2i // == 1.0 + 2.0i
1. - .1i // == 1.0 + -0.1i
1.23i - 7.89 // == -7.89 + 1.23i
1.23i // == 0.0 + 1.23i
القيم الحرفية القياسية للقيم الصفرية للأنواع المركّبة هي 0.0+0.0i، مع وجود قيم حرفية قانونية أخرى كثيرة، مثل 0i و.0i و0+0i وغيرها. في الواقع، القيم الحرفية الصفرية التي ستُقدَّم في هذه المقالة لأنواع عددية أخرى يمكنها أيضًا تمثيل القيمة الصفرية لأي نوع مركّب.
استخدام _ في القيم الحرفية العددية لقراءة أفضل
منذ Go 1.13، يمكن أن تظهر الشرطات السفلية _ في القيم الحرفية الصحيحة والعشرية والتخيلية كفواصل بين الأرقام لتعزيز قراءة الشيفرة. ولكن انتبه، في القيمة الحرفية العددية:
- لا يُسمح باستخدام أي
_كأول أو آخر محرف في القيمة الحرفية، - يجب أن يكون طرفا أي
_إما بادئات حرفية (مثل0X) أو محارف رقمية قانونية.
بعض القيم الحرفية العددية القانونية وغير القانونية التي تحتوي شرطات سفلية:
// القانونية:
6_9 // == 69
0_33_77_22 // == 0337722
0x_Bad_Face // == 0xBadFace
0X_1F_FFP-16 // == 0X1FFFP-16
0b1011_0111 + 0xA_B.Fp2i
// غير القانونية:
_69 // لا يمكن أن يظهر _ كأول محرف
69_ // لا يمكن أن يظهر _ كآخر محرف
6__9 // أحد طرفي _ محرف غير قانوني
0_xBadFace // الحرف "x" ليس رقمًا ثمانيًا قانونيًا
1_.5 // الفاصلة "." ليست رقمًا ثمانيًا قانونيًا
1._5 // الفاصلة "." ليست رقمًا ثمانيًا قانونيًا
القيم الحرفية لـ rune
أنواع rune، بما فيها أنواع rune المخصّصة المعرَّفة والنوع المدمج rune (المعروف أيضًا باسم النوع int32)، هي أنواع صحيحة خاصة، لذا يمكن الإشارة إلى جميع قيم rune بالقيم الحرفية الصحيحة المُقدَّمة أعلاه. ومن جهة أخرى، يمكن أيضًا تمثيل كثير من قيم جميع أنواع الأعداد الصحيحة بقيم rune الحرفية المُقدَّمة أدناه في هذا القسم الفرعي.
الغرض من قيمة rune تخزين نقطة رمز (code point) من Unicode. عمومًا، يمكننا اعتبار نقطة الرمز محرف Unicode، لكن ينبغي أن نعلم أن بعض محارف Unicode تتكون كل منها من أكثر من نقطة رمز واحدة.
تُكتب قيمة rune الحرفية بمحرف واحد أو أكثر محاطين بزوج من علامات الاقتباس. تدل المحارف المُحاطة على قيمة نقطة رمز Unicode واحدة. وهناك بعض الصيغ الفرعية الطفيفة لقيمة rune الحرفية. أكثر صيغ قيم rune الحرفية شيوعًا هي مجرد إحاطة المحارف التي تدل عليها قيم rune بعلامتي اقتباس مفردتين. مثلًا
'a' // محرف إنجليزي
'π'
'众' // محرف صيني
صيغ قيمة rune الحرفية التالية تكافئ 'a' (قيمة Unicode للمحرف a هي 97).
// 141 هو التمثيل الثماني للعدد العشري 97.
'\141'
// 61 هو التمثيل الست عشري للعدد العشري 97.
'\x61'
'\u0061'
'\U00000061'
انتبه: يجب أن يتبع \ بالضبط ثلاثة أرقام ثمانية لتمثيل قيمة بايت، ويجب أن يتبع \x بالضبط رقمان ست عشريان لتمثيل قيمة بايت، ويجب أن يتبع \u بالضبط أربعة أرقام ست عشرية لتمثيل قيمة rune، ويجب أن يتبع \U بالضبط ثمانية أرقام ست عشرية لتمثيل قيمة rune. ويجب أن يمثل كل تسلسل أرقام ثمانية أو ست عشرية كهذا نقطة رمز Unicode قانونية، وإلا فشل التصريف.
سيطبع البرنامج التالي 7 نصوص true.
package main
func main() {
println('a' == 97)
println('a' == '\141')
println('a' == '\x61')
println('a' == '\u0061')
println('a' == '\U00000061')
println(0x61 == '\x61')
println('\u4f17' == '众')
}
في الواقع، نادرًا ما تُستخدم صيغ قيم rune الحرفية الأربع المذكورة للتو لقيم rune في الممارسة العملية. وتُستخدم أحيانًا في القيم الحرفية النصية المُفسَّرة (انظر القسم الفرعي التالي للتفاصيل).
إذا كانت قيمة rune الحرفية مكونة من محرفين (دون احتساب علامتي الاقتباس)، أولهما المحرف \ والثاني ليس محرفًا رقميًا ولا x ولا u ولا U، فسيُهرَّب المحرفان المتتاليان كمحرف خاص واحد. وأزواج المحارف الممكن هروبها هي:
\a (قيمة Unicode 0x07) تنبيه أو جرس
\b (قيمة Unicode 0x08) مسافة خلفية
\f (قيمة Unicode 0x0C) تغذية نموذج
\n (قيمة Unicode 0x0A) تغذية سطر أو سطر جديد
\r (قيمة Unicode 0x0D) إرجاع عربة
\t (قيمة Unicode 0x09) جدولة أفقية
\v (قيمة Unicode 0x0b) جدولة رأسية
\\ (قيمة Unicode 0x5c) شرطة مائلة عكسية
\' (قيمة Unicode 0x27) علامة اقتباس مفردة
\n هو زوج محارف الهروب الأكثر استخدامًا.
مثال:
println('\n') // 10
println('\r') // 13
println('\'') // 39
println('\n' == 10) // true
println('\n' == '\x0A') // true
هناك قيم حرفية كثيرة يمكنها الإشارة إلى القيم الصفرية لأنواع rune، مثل '\000' و'\x00' و'\u0000' وغيرها. في الواقع، يمكننا أيضًا استخدام أي قيمة حرفية عددية قُدِّمت أعلاه لتمثيل قيم أنواع rune، مثل 0 و0x0 و0.0 و0e0 و0i وغيرها.
القيم الحرفية النصية
القيم النصية في Go مُرمَّزة بترميز UTF-8. في الواقع، يجب أن تكون جميع ملفات مصدر Go متوافقة مع ترميز UTF-8.
هناك صيغتان للقيم الحرفية النصية: القيمة الحرفية النصية المُفسَّرة (صيغة علامتي الاقتباس المزدوجتين) والقيمة الحرفية النصية الخام (صيغة علامتي الاقتباس العكسيتين). مثلًا، القيمتان الحرفيتان النصيتان التاليتان متكافئتان:
// الصيغة المُفسَّرة.
"Hello\nworld!\n\"你好世界\""
// الصيغة الخام.
`Hello
world!
"你好世界"`
في القيمة الحرفية النصية المُفسَّرة أعلاه، يُهرَّب كل زوج محرفين \n كمحرف سطر جديد واحد، ويُهرَّب كل زوج محرفين \" كمحرف اقتباس مزدوج واحد. معظم أزواج محارف الهروب هذه هي نفسها المستخدمة في قيم rune الحرفية المُقدَّمة أعلاه، باستثناء أن \" قانوني فقط في القيم الحرفية النصية المُفسَّرة و``` قانوني فقط في قيم rune الحرفية.
يمكن أيضًا استخدام تسلسل المحارف \ و\x و\u و\U المتبوع بعدة أرقام ثمانية أو ست عشرية، كما قُدِّم في القسم السابق، في القيم الحرفية النصية المُفسَّرة.
// القيم الحرفية النصية المُفسَّرة التالية متكافئة.
"\141\142\143"
"\x61\x62\x63"
"\x61b\x63"
"abc"
// القيم الحرفية النصية المُفسَّرة التالية متكافئة.
"\u4f17\xe4\xba\xba"
// قيمة Unicode للمحرف 众 هي 4f17، وهي
// مُرمَّزة بترميز UTF-8 بثلاثة بايتات: e4 bc 97.
"\xe4\xbc\x97\u4eba"
// قيمة Unicode للمحرف 人 هي 4eba، وهي
// مُرمَّزة بترميز UTF-8 بثلاثة بايتات: e4 ba ba.
"\xe4\xbc\x97\xe4\xba\xba"
"众人"
انتبه إلى أن كل محرف إنجليزي (نقطة رمز) يُمثَّل ببايت واحد، في حين أن كل محرف صيني (نقطة رمز) يُمثَّل بثلاثة بايتات.
في القيمة الحرفية النصية الخام، لا تُهرَّب أي تسلسلات محارف. ولا يُسمح بظهور محرف علامة الاقتباس العكسية في القيمة الحرفية النصية الخام. ولتحقيق توافق أفضل بين المنصات، تُهمَل محارف إرجاع العربة (نقطة رمز Unicode 0x0D) داخل القيم الحرفية النصية الخام.
يمكن الإشارة إلى القيم الصفرية للأنواع النصية بالقيمة الحرفية "" أو ````.
قابلية تمثيل القيم الحرفية العددية الأساسية
لا يمكن استخدام قيمة حرفية عددية لتمثيل قيمة صحيحة إلا إذا لم تكن بحاجة إلى تقريب. مثلًا، يمكن استخدام 1.23e2 لتمثيل قيم أي نوع صحيح أساسي، لكن لا يمكن استخدام 1.23 لتمثيل قيم أي نوع صحيح أساسي. ويُسمح بالتقريب عند استخدام قيمة حرفية عددية لتمثيل قيم عددية أساسية غير صحيحة.
لكل نوع عددي أساسي نطاق قيم قابل للتمثيل. لذا، إذا تجاوزت قيمة حرفية نطاق قيم نوع ما، فإنها لا تكون قابلة للتمثيل كقيم من ذلك النوع.
بعض الأمثلة:
| القيمة الحرفية | الأنواع التي يمكن تمثيل قيمها بهذه القيمة الحرفية |
|---|---|
256 |
جميع الأنواع العددية الأساسية باستثناء نوعي int8 و uint8. |
255 |
جميع الأنواع العددية الأساسية باستثناء أنواع int8. |
-123 |
جميع الأنواع العددية الأساسية باستثناء الأنواع غير المُوقَّعة. |
123 |
جميع الأنواع العددية الأساسية. |
123.000 |
|
1.23e2 |
|
'a' |
|
1.0+0i |
|
1.23 |
جميع الأنواع العددية العشرية والمركّبة الأساسية. |
0x10000000000000000 |
|
| (16 صفرًا) | |
3.5e38 |
جميع الأنواع العددية العشرية والمركّبة الأساسية باستثناء نوعي float32 و complex64. |
1+2i |
جميع الأنواع العددية المركّبة الأساسية. |
2e+308 |
لا شيء من الأنواع الأساسية. |
ملاحظات:
- بما أنه لا يمكن لأي قيمة من الأنواع الصحيحة الأساسية التي توفرها Go أن تستوعب
0x10000000000000000، فإن هذه القيمة الحرفية غير قابلة للتمثيل كقيم لأي نوع صحيح أساسي. - أكبر قيمة IEEE-754 float32 يمكن تمثيلها بدقة هي
3.40282346638528859811704183484516925440e+38، لذا فإن3.5e38غير قابلة للتمثيل كقيم لأي من نوعي float32 و complex64. - أكبر قيمة IEEE-754 float64 يمكن تمثيلها بدقة هي
1.797693134862315708145274237317043567981e+308، لذا فإن2e+308غير قابلة للتمثيل كقيم لأي من النوعينfloat64وcomplex128. - أخيرًا، انتبه: مع أن
0x10000000000000000يمكن أن تمثّل قيمًا من أنواع float32، إلا أنها لا تستطيع تمثيل أي قيم float32 بدقة في الذاكرة. بعبارة أخرى، ستُقرَّب إلى أقرب قيمة float32 يمكن تمثيلها بدقة في الذاكرة عندما تُستخدم كقيم من أنواع float32.