C# 中的位移问题

本文关键字:问题 | 更新日期: 2023-09-27 18:32:55

private static byte xtime(byte Tm)
{
        int p = Convert.ToInt32(Tm);
        int p1 = (p >> 7);
        int p2 = (p1 & 1);
        int p3=(p2 * 0x1b);
        int p4 = (p << 1);
        int p5 = p4 ^ p3;
        byte p6 = (Convert.ToByte(p5));
        return p6;
}

当输出低于 255 但崩溃时,此函数工作正常(溢出异常)。

例如,如果 Tm 为 163,则输出应为 93(我通过使用无符号字符作为数据类型在 C lang 中执行相同的代码获得了这个值)

任何人都可以建议一种使此功能工作的方法吗?

C# 中的位移问题

如果你查看 Convert.ToByte() 文档,它产生的唯一例外实际上是

OverflowException原因

值小于 Byte.MinValue 或大于 Byte.MaxValue。

代码中的p5变得349 .

要解决此问题,请执行以下操作:

1) 由于注释中的操作byte类型,不会将其转换为int

2)在适当的情况下投掷到(byte)。强制转换截断并且不会生成异常。

所以你的最终代码可能看起来像这样(只是应对而不用争论代码的语义):

    byte p1 = (byte)(Tm >> 7);
    byte p2 = (byte)(p1 & 1);
    byte p3=  (byte)(p2 * 0x1b);
    byte p4 = (byte)(Tm << 1);
    byte p5 = (byte)(p4 ^ p3);      
    byte p6 = p5;

并根据需要p6 = 93

问题是p4将生成一个大于字节中允许的值的值。如果转换为 byte ,它将截断较高的位:

var p4 = (byte)(p << 1);