这是我的原始功能
private static Int32 getInt(byte[] Data, char Endianness)
{
if (Data.Length > 3)
{
switch (Endianness)
{
case 'l':
return ((Int32)(Data[3]) << 24) + ((Int32)(Data[2]) << 16) + ((Int32)(Data[1]) << 8) + (Int32)(Data[0]);
case 'b':
return ((Int32)(Data[0]) << 24) + ((Int32)(Data[1]) << 16) + ((Int32)(Data[2]) << 8) + (Int32)(Data[3]);
default:
throw new ArgumentException("Wrong endianness type", "Endianness types are 'l' or 'b'");
}
}
else
{
throw new ArgumentException("NVM data corruption", "Failed to parse NVM data");
}
}
我正在使用Resharper,它建议删除对Int32的转换,因为它是多余的。
所以我们将此代码作为输出
private static int getInt(byte[] Data, char Endianness)
{
if (Data.Length > 3)
{
switch (Endianness)
{
case 'l':
return (Data[3] << 24) + (Data[2] << 16) + (Data[1] << 8) + Data[0];
case 'b':
return (Data[0] << 24) + (Data[1] << 16) + (Data[2] << 8) + Data[3];
default:
throw new ArgumentException("Wrong endianness type", "Endianness types are 'l' or 'b'");
}
}
throw new ArgumentException("NVM data corruption", "Failed to parse NVM data");
}
在代码中,您看到我将Data[2] << 16
移到该数字可能会从原始字节溢出的情况,如果我删除了对Int32的强制转换,是否冒着对字节进行修整的风险?
能否请您解释一下C#预处理器/编译器在做什么?
谢谢
答案 0 :(得分:4)
强制类型转换是多余的,因为当您使用Data[2]
运算符时,编译器会自动将left-shift
提升为整数,并且该运算的结果也将为整数。因此不会丢失任何数据。