用于符号扩展操作数的位或操作符;首先考虑转换为较小的无符号类型
本文关键字:转换 类型 无符号 扩展操作 扩展 符号 操作数 位或 操作符 用于 | 更新日期: 2023-09-27 18:07:42
我知道这些警告可能毫无意义。但不管怎样,我可以摆脱它们?
我收到了7次这样的警告。
Bitwise-or operator used on a sign-extended operand; consider casting to a smaller unsigned type first
这与或运算符|
我强调了发出警告的东西。
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搜索显示了这个警告的官方文档,其中有一个解释:
编译器隐式扩展和符号扩展变量,然后在位或操作中使用结果值。这可能导致意想不到的行为。
问题是表达式v75 | 0x862D63D3
的形式为int | uint
。这是通过将两边都提升到long
来计算的。如果你真的想扩展符号,写(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和其他带有无符号十六进制值的变量转换为int:
((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
你想要怎样的结果?