在不更改 C# 中的位的情况下将字节转换为 sbyte

Convert byte to sbyte without changing bits in C#

我想将一个字节转换为一个 sbyte,而不更改任何位。

byte b = 0x84;
sbyte sb = unchecked((sbyte)b);
Console.WriteLine("0x" + Convert.ToString(b, 16));
Console.WriteLine("0x" + Convert.ToString(sb, 16));

结果将是:

0x84
0xff84

我理解结果的含义以及它发生的原因。但是,我似乎无法找出如何避免这种行为。如何复制字节的实际二进制值并将其放入 sbyte 中?

位在 bsb 之间根本没有变化。此行为来自 Convert.ToString(). There just isn't an overload of Convert.ToString() that takes an sbyte and a base. The closest match would be Convert.ToString Method (Int16, Int32)。所以 sb 被符号扩展为 16 位。

通常使用 ToString 会产生不太令人惊讶的结果,并且不会涉及意外转换(如 shf301 的 中所述的 sbyte -> short)。

byte b = 0x84;
sbyte sb = unchecked((sbyte)b);
Console.WriteLine("0x" + b.ToString("x"));
Console.WriteLine("0x" + sb.ToString("x"));

或者直接使用格式:

String.Format("0x{0:x}",((unchecked ((sbyte)0x84))))