2012-06-25 17 views
10

Ho una variabile di tipo sbyte e desidero copiare il contenuto in un byte. La conversione non sarebbe una conversione di valore, piuttosto una copia bit per bit.Conversione di sbyte in byte

Ad esempio,

se mySbyte in bit è: '10.101.100', dopo la conversione, la variabile byte corrispondente conterrà anche i bit '10.101.100'.

+2

Perché non basta lanciarlo su 'byte'? – V4Vendetta

+0

@ V4Vendetta: Funzionerà, leggo da qualche parte se il valore è fuori intervallo, che è negativo su sbyte, genererà un'eccezione. –

+0

Beh, non dire veramente il suo -1 allora si otterrebbe come 255 – V4Vendetta

risposta

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

più su unchecked è here

4

come questo:

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

Aggiunto chiarimento, cosa si intende per non selezionato come usato qui? –

+4

Poiché 250 supera l'intervallo di sbyte (-128 - 127), è necessaria una conversione non selezionata. –

15

Vorrei chiarire la unchecked business. Lo MSDN page indica che unchecked viene utilizzato per impedire il controllo di overflow, che altrimenti, all'interno di un contesto controllato, fornire un errore di compilazione o generare un'eccezione.

... IF all'interno di un contesto verificato.

Il contesto è controllato in maniera esplicita:

checked { ... } 

o implicitamente *, quando si tratta di in fase di compilazione costanti:

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

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

Ma quando si tratta di runtime variabili, il contesto è unchecked per impostazione predefinita **:

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 

Per riassumere e rispondere alla domanda iniziale:

Bisogno byte<->sbyte conversione sul costanti? Utilizzare unchecked e cast:

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

Bisogno byte<->sbyte conversione sul variabili? Basta Cast:

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

* C'è un terzo modo per ottenere un contesto selezionata per impostazione predefinita: modificando le impostazioni del compilatore. Per esempio. Visual Studio -> Proprietà del progetto -> Build -> Avanzate ... -> [X] Controllare l'aritmetica di overflow/underflow

** Il contesto di esecuzione è deselezionata per impostazione predefinita in C#. Ad esempio, in VB.NET, il contesto di runtime predefinito è CONTROLLATO.