هل يتم ترقية المعاملات داخل تعبير إلى أنواع أكبر وفقًا للقواعد التالية؟
-
28-09-2019 - |
سؤال
إذا كان التعبير الرقمي يحتوي على معاملات (ثوابت ومتغيرات) من أنواع رقمية مختلفة ، يتم ترقية المعاملات إلى أنواع أكبر وفقًا للقواعد التالية:
- إذا كانت المعاملات من أنواع
byte
,sbyte
,char
,short
,ushort
, ، يتم تحويلها إلىint
يكتب - إذا كان أحد المعاملات
int
, ، ثم يتم تحويل جميع المعاملات إلىint
- إذا كان التعبير يحتوي أيضًا على معاملات الأنواع
uint
وint
, ، ثم يتم تحويل جميع المعاملات إلىlong
- إذا كان أحد المعاملات
long
, ، ثم يتم تحويل جميع المعاملات إلىlong
- إذا كان التعبير يحتوي على معاملات من النوع
ulong
وlong
, ، ثم يتم تحويل المعاملات إلىfloat
- إذا كان أحد المعاملات
float
, ، ثم يتم تحويل جميع المعاملات إلىfloat
- إذا كان أحد المعاملات
double
, ، ثم يتم تحويل جميع المعاملات إلىdouble
على افتراض أن التعبيرات الرقمية تحتوي على معاملات من أنواع مختلفة ، هل سيتم تحويل جميع المعاملات أولاً إلى نوع رقمي واحد ، وعندها فقط سيحاول وقت التشغيل حساب النتيجة؟ على سبيل المثال ، إذا كانت المتغيرات b1
و b2
هم من byte
اكتب ، بينما i1
هو من int
النوع ، سوف b1
و B2 get
تم تحويلها إلى int قبل الحوسبة (b1+b2)
:
int i2=(b1+b2)+i1
المحلول
الأقواس ذات الأسبقية أعلى من +
, ، وبالتالي فإن التحويل سيحدث عادة بعد b1
و b2
قد أضيف. ومع ذلك ، فإن +
المشغل أو العامل ليس لديه تحميل زائد إلى عن على byte
S ، لذلك byte
يجب أولاً ترقية S إلى int
س.
قراءة متعمقة:
نصائح أخرى
قواعدك لديها بعض عناصر الحقائق ، ولكنها غير دقيقة من الناحية الفنية.
فيما يلي مقتطفات ذات صلة من مواصفات لغة C#
7.2.6.2 الترقيات الرقمية الثنائية
يحدث الترويج الرقمي الثنائي لمعاملات المحددة مسبقًا
+
,–
,*
,/
,%
,&
,|
,^
,==
,!=
,>
,<
,>=
, ، و<=
مشغلي ثنائي. يحول الترويج الرقمي الثنائي ضمنيًا كلا المعاملين إلى نوع مشترك والذي ، في حالة المشغلين غير العلميين ، يصبح أيضًا نوع النتيجة للعملية. يتكون الترويج الرقمي الثنائي من تطبيق القواعد التالية ، بالترتيب الذي يظهرون هنا:
- إذا كان أي من المعامل من النوع
decimal
, ، يتم تحويل المعامل الآخر إلى الكتابةdecimal
, ، أو يحدث خطأ في وقت الترجمة إذا كان المعامل الآخر من النوعfloat
أوdouble
.- خلاف ذلك ، إذا كان أي من المعامل من النوع
double
, ، يتم تحويل المعامل الآخر إلى الكتابةdouble
.- خلاف ذلك ، إذا كان أي من المعامل من النوع
float
, ، يتم تحويل المعامل الآخر إلى الكتابةfloat
.- خلاف ذلك ، إذا كان أي من المعامل من النوع
ulong
, ، يتم تحويل المعامل الآخر إلى الكتابةulong
, ، أو يحدث خطأ في وقت الترجمة إذا كان المعامل الآخر من النوعsbyte
,short
,int
, ، أوlong
.- خلاف ذلك ، إذا كان أي من المعامل من النوع
long
, ، يتم تحويل المعامل الآخر إلى الكتابةlong
.- خلاف ذلك ، إذا كان أي من المعامل من النوع
uint
والمعامل الآخر من النوعsbyte
,short
, ، أوint
, ، يتم تحويل كلا المعاملين إلى النوعlong
.- خلاف ذلك ، إذا كان أي من المعامل من النوع
uint
, ، يتم تحويل المعامل الآخر إلى الكتابةuint
.- خلاف ذلك ، يتم تحويل كلا المعاملين إلى النوع
int
.
int i2=(b1+b2)+i1
حسب المواصفات أعلاه ، نعم ، byte b1, b2
تخضع لترويج رقمي ثنائي ل int
للمشغل الثنائي +
.