将Byte转换为SByte

3

我正在从串口读取字节,但我需要将它们转换为有符号的8位整数(SByte)。不幸的是,在Visual Basic中,溢出检查会防止Byte值255变成SByte中的-1。因此,本质上,我想要做以下事情:

uint8_t a = 255;
int8_t b = (int8_t)a;    // b == -1

如何在Visual Basic中实现这个功能?

1
uint会是无符号的对吧?所以如果a=-1,b就会变成奇怪的东西。 - Paul Nikonowicz
@PaulNikonowicz:上述的C代码将简单地将字节,如它们存储在a中,放置在b中。由于a = 255(0b11111111),那么b也将是0b11111111,并且因此将被解释为-1,假设编译器使用2的补码符号表示来存储有符号整数。 - Amr Bekhit
不管你假设什么,一旦尝试应用算术或打印 b,你就会得到一些意想不到的结果。除非你实际上是在尝试为国际混淆 C 代码大赛做贡献。 - Paul Nikonowicz
2个回答

4

我可以使用Visual Basic手动完成这个操作,方法如下:IIf

Dim a as Byte = 255
Dim b as SByte = IIf(a < 128, a, a - 256)

2

VB看起来不是处理位操作的最佳选择。也许你可以使用C#来创建一个单独的程序集,这样你就可以轻松地进行以下操作:

byte b = 255;
sbyte sb = (sbyte) b;

(C#默认情况下运行时操作是未经检查的)

或者,您可以在VB项目级别关闭溢出检查。

项目属性 -> 编译 -> 高级编译器选项 -> [X] 删除整数溢出检查

现在,您只需要进行强制转换!无需算术运算!

Dim b As Byte = 255
Dim sb As SByte = CSByte(b)

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