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 中执行相同的代码获得了这个值)
任何人都可以建议一种使此功能工作的方法吗?
如果你查看 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);