2012-06-25 22 views
10

Tengo una variable de tipo sbyte y me gustaría copiar el contenido a byte. La conversión no sería una conversión de valor, sino una copia de bit por bit.Convertir sbyte en byte

Por ejemplo,

si mySbyte en bits es: '10101100', después de la conversión, la variable byte correspondiente será también contienen los bits '10101100'.

+2

¿Por qué no simplemente lo convierte en 'byte'? – V4Vendetta

+0

@ V4Vendetta: Funcionará, leo en alguna parte si el valor está fuera de rango, que es negativo en sbyte, arrojará una excepción. –

+0

Bueno, realmente no dice que es -1, entonces lo obtendría como 255 – V4Vendetta

Respuesta

4
unchecked 
{ 
    sbyte s; 
    s= (sbyte)"your value"; 
    byte b=(byte)s; 
} 

Más sobre unchecked es here

4

así:

sbyte sb = 0xFF; 
byte b = unchecked((byte)sb); 
3
unchecked 
{ 
    sbyte s = (sbyte)250; //-6 (11111010) 
    byte b = (byte)s; //again 250 (11111010) 
} 
+0

Clarificación agregada, ¿qué quiere decir sin marcar como se usa aquí? –

+4

Como 250 excede el rango de sbyte (-128 - 127), se necesita una conversión sin marcar. –

15

Aclaro el negocio unchecked. El MSDN page indica que unchecked se usa para evitar la verificación de desbordamiento, que de lo contrario, cuando está dentro de un contexto marcado, produce un error de compilación o arroja una excepción.

... IF dentro de un contexto verificado.

El contexto se comprueba de forma explícita:

checked { ... } 

o implícitamente *, cuando se trata de tiempo de compilación constantes de:

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

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

Pero cuando se trata de tiempo de ejecución variables, el contexto es unchecked por defecto **:

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 

Para resumir y responder a la pregunta original:

Necesidad byte<->sbyte conversión en constantes? Utilice unchecked y reparto:

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

Necesidad byte<->sbyte la conversión de las variables ? Justo reparto:

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

* Hay una tercera forma de obtener un contexto marcado por defecto: por ajustar la configuración del compilador. P.ej. Visual Studio -> Propiedades del proyecto -> Build -> Avanzado ... -> [X] Compruebe si la aritmética desbordamiento/subdesbordamiento

** El contexto de ejecución está marcada por defecto en C#. En VB.NET, por ejemplo, el contexto de tiempo de ejecución predeterminado es COMPROBADO.