【问题标题】:Convert byte to sbyte without changing bits in C#将字节转换为 sbyte 而不更改 C# 中的位
【发布时间】:2015-07-25 12:08:16
【问题描述】:

我想将一个字节转换为 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 中?

【问题讨论】:

  • 不会因为 sbyte 使用二进制补码而导致位不同吗?

标签: c# casting unsigned signed


【解决方案1】:

位在bsb 之间根本没有变化。此行为来自Convert.ToString()。只是没有Convert.ToString() 的重载需要sbyte 和一个基础。最接近的匹配是Convert.ToString Method (Int16, Int32)。所以sb 被符号扩展为 16 位。

【讨论】:

    【解决方案2】:

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

    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))))
    

    【讨论】:

      猜你喜欢
      • 2014-06-25
      • 2011-03-12
      • 2011-08-05
      • 2015-08-21
      • 2023-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-07
      相关资源
      最近更新 更多