将sbyte转换为byte

12

我有一个类型为sbyte的变量,想要将其内容复制到一个byte中。这个转换不会是一个值转换,而是逐位复制。

例如,

如果我的sbyte在位上是:'10101100',转换后,相应的byte变量也将包含位'10101100'。


2
为什么不直接将它转换为 byte 类型? - V4Vendetta
1
@V4Vendetta:它会工作吗?我在某个地方读到,如果sbyte的值超出范围,即为负数,会抛出异常。 - Shamim Hafiz - MSFT
不要真的说它是-1,否则你会得到255。 - V4Vendetta
@V4Vendetta是正确的,对于转换运行时变量,您不需要使用unchecked。有关完整详细信息,请参阅我的答案。 - Cristian Diaconescu
4个回答

21

让我澄清一下unchecked的作用。 MSDN页面指出,unchecked用于防止溢出检查,否则,在checked上下文中,会导致编译错误或抛出异常。

...如果checked上下文中。

这个上下文可以通过显式方式进行检查:

checked { ... } 

或者隐式地,当处理编译时常量时:

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

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

但是在处理运行时变量时,默认情况下上下文是unchecked

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

总结并回答原问题:

需要将常量从 byte<->sbyte 进行转换?使用 unchecked 和强制类型转换:

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

需要将 变量byte<->sbyte 进行转换?只需进行强制类型转换:

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

* 有第三种方法可以默认获取已检查的上下文:通过调整编译器设置。例如,Visual Studio -> 项目属性 -> 构建 -> 高级... -> [X] 检查算术溢出/下溢

** 在C#中,默认情况下运行时上下文是未检查的。例如,在VB.NET中,运行时上下文的默认值为CHECKED。


5
unchecked
{
    sbyte s = (sbyte)250; //-6 (11111010) 
    byte b = (byte)s; //again 250 (11111010) 
}

增加了澄清,这里所说的“unchecked”是什么意思? - Shamim Hafiz - MSFT
4
由于250超出了sbyte(-128至127)的范围,需要进行未经检查的转换。 - L.B

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

有关于unchecked的更多信息,请查看此处


4

像这样:

sbyte sb = 0xFF;
byte b = unchecked((byte)sb);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接