تحويل sbyte إلى بايت

لدي متغير من النوع sbyte وترغب في نسخ المحتوى إلى byte . لن يكون التحويل عبارة عن تحويل للقيمة ، وإنما نسخة بت لكل بت.

فمثلا،

إذا كانت mySbyte بالبت: "10101100" ، بعد التحويل ، سيحتوي متغير البايت المقابل أيضًا على البتات "10101100".

10
@ V4Vendetta صحيح ، لا تحتاج إلى غير محدد للإدخال متغيرات وقت التشغيل . انظر إجابتي للحصول على التفاصيل الكاملة.
وأضاف المؤلف Cristi Diaconescu, مصدر
@ V4Vendetta: هل ستعمل ، قرأت في مكان ما إذا كانت القيمة خارج النطاق ، وهذا هو سلبي على sbyte ، سوف رمي استثناء.
وأضاف المؤلف Shamim Hafiz, مصدر
لماذا لا نلقيها فقط على byte ؟
وأضاف المؤلف V4Vendetta, مصدر
حسنا لا أقول حقا -1 ثم ستحصل عليه في 255
وأضاف المؤلف V4Vendetta, مصدر

4 إجابة

اسمحوا لي أن أوضح غير محدد business. تنص صفحة MSDN على يتم إلغاء تحديدها لمنع تدقيق الفائض ، والتي يمكن ، بخلاف ذلك ، عندما تكون داخل سياق محدد ، إعطاء خطأ في الترجمة أو طرح استثناء.

... IF داخل سياق محدد.

يتم فحص السياق بشكل صريح:

checked { ... } 

أو ضمنيًا * ، عند التعامل مع ثوابت وقت التحويل البرمجي :

byte b = (byte)-6; //compile error
byte b2 = (byte)(200 + 200); //compile error

int i = int.MaxValue + 10; //compiler error

ولكن عند التعامل مع متغيرات وقت التشغيل ، يكون السياق غير محدد افتراضيًا **:

sbyte sb = -6;
byte b = (byte)sb; //no problem, sb is a variable


int i = int.MaxValue;
int j = i + 10;    //no problem, i is a variable

لتلخيص والإجابة على السؤال الأصلي:

Need byte<->sbyte conversion on constants? Use unchecked and cast:

byte b = unchecked( (byte) -6 );

Need byte<->sbyte conversion on variables? Just cast:

sbyte sb = -6;
byte b = (byte) sb;

* There is a third way to get a checked context by default: by tweaking the compiler settings. E.g. Visual Studio -> Project properties -> Build -> Advanced... -> [X] Check for arithmetic overflow/underflow

** يتم إلغاء تحديد سياق وقت التشغيل بشكل افتراضي في C# . في VB.NET على سبيل المثال ، يكون سياق التشغيل الافتراضي هو CHECKED.

15
وأضاف
unchecked
{
    sbyte s;
    s= (sbyte)"your value";
    byte b=(byte)s;
}

More about unchecked is here

4
وأضاف

مثله:

sbyte sb = 0xFF;
byte b = unchecked((byte)sb);
4
وأضاف
unchecked
{
    sbyte s = (sbyte)250; //-6 (11111010) 
    byte b = (byte)s; //again 250 (11111010) 
}
3
وأضاف
التوضيح المضافة ، ما هو المقصود من قبل غير محددة كما هو مستخدم هنا؟
وأضاف المؤلف Shamim Hafiz, مصدر
منذ 250 يتجاوز نطاق sbyte (-128 - 127) هناك حاجة إلى تحويل غير محددة.
وأضاف المؤلف L.B, مصدر