在不更改 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 中?
位在 b
和 sb
之间根本没有变化。此行为来自 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))))
我想将一个字节转换为一个 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 中?
位在 b
和 sb
之间根本没有变化。此行为来自 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))))