C#Bitwise-或运算符用于符号扩展操作数; 首先考虑转换为较小的无符号类型

我知道这些警告可能毫无意义..但无论如何我可以摆脱它们?

我收到了7个这样的警告。

Bitwise-or operator used on a sign-extended operand; consider casting to a smaller unsigned type first

这与OR运算符有关

我突出了发出警告的内容。

 int result = (int)ror((uint)(v76 ^ (v75 | 0x862D63D3)), (uint)(BitConverter.ToInt32(v4, 72) ^ 0x22)); int v11 = (int)rol((uint)(int)((v8 & v10 | ~v10 & 0xEFCDAAC9) + v3[2] - 1126481991), 17); int v144 = (int)rol((uint)(int)((v141 & v143 | ~v143 & 0xEFCDAAC9) + v3[2] - 1126481991), 17); int v77 = (int)(`BitConverter.ToInt32(v4, 52) | 0x96C35837`); BitConverter.GetBytes((int)(v30 & 0x870DEA8A | v29)).CopyTo(v2, 32); int temp24 |= (int)(BitConverter.ToInt32(v3, 48) | 0x96B4A1B4); int v17 = (int)(BitConverter.ToInt32(v3, 12) | 0x83868A1D); 

快速Web搜索显示警告的官方文档 ,其中包含一个解释:

编译器隐式地扩展并对变量进行符号扩展,然后在按位OR运算中使用结果值。 这可能会导致意外行为。

问题是表达式v75 | 0x862D63D3 v75 | 0x862D63D3的forms为int | uint int | uint 。 这是通过将双方推向long来计算的。 如果你真的想要签名扩展,请写(ulong)(long)v75 | 0x862D63D3 (ulong)(long)v75 | 0x862D63D3 。 如果你真的想要零扩展,那么写(uint)v75 |0x862D63D3

 class Program { public static void Main() { int v75 = int.MinValue; System.Console.WriteLine("{0:x}", v75 | 0x862D63D3); System.Console.WriteLine("{0:x}", (ulong)(long)v75 | 0x862D63D3); System.Console.WriteLine("{0:x}", (uint)v75 | 0x862D63D3); } } 

这个程序打印

 ffffffff862d63d3 ffffffff862d63d3 862d63d3 

如您所见,编译器默认为第一种解释,这可能不是您想要的。

尝试将v75和其他变量与无符号hex值进行OR运算到uint:

 ((uint)v75 | 0x862D63D3) 

或者将变量声明为uint而不是int

如果对int和long变量执行OR运算,则系统将int转换为long。 存在两种方式:

 namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Console.WriteLine($"int.MinValue = {Convert.ToString(int.MinValue, 2)}"); Console.WriteLine($"long.MinValue = {Convert.ToString(long.MinValue, 2)}"); Console.WriteLine(); long cast1 = int.MinValue; // !!! long cast2 = unchecked((uint)int.MinValue); // !!! Console.WriteLine($"default cast = {Convert.ToString(cast1, 2)}"); Console.WriteLine($"custom cast = {Convert.ToString(cast2, 2)}"); Console.WriteLine(); Console.WriteLine($"default long OR int = {Convert.ToString(long.MinValue | int.MinValue, 2)}"); Console.WriteLine($"custom long OR int = {Convert.ToString(long.MinValue | unchecked((uint)int.MinValue), 2)}"); } } 

结果:

 int.MinValue = 10000000000000000000000000000000 long.MinValue = 1000000000000000000000000000000000000000000000000000000000000000 default cast = 1111111111111111111111111111111110000000000000000000000000000000 custom cast = 0000000000000000000000000000000010000000000000000000000000000000 default long OR int = 1111111111111111111111111111111110000000000000000000000000000000 custom long OR int = 1000000000000000000000000000000010000000000000000000000000000000 

你想要的结果如何?