operator exclusivo exclusive check c# bit-manipulation compiler-warnings suppress-warnings

exclusivo - null c# operator



C#Bitwise o operador utilizado en un operando de signo extendido; Considere lanzar un tipo sin firma más pequeño primero (3)

Intente convertir v75 y otras variables con OR con valores hexadecimales sin signo para uint:

((uint)v75 | 0x862D63D3)

o declara las variables como uint lugar de int .

Sé que estas advertencias probablemente no tienen sentido ... ¿Pero de todos modos podría deshacerme de ellas?

Tengo 7 de estas advertencias.

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

Esto tiene algo que ver con el operador OR |

Destacé lo que desprende las advertencias.

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);


Si realiza la operación OR para la variable int y long, entonces el sistema emitirá int a long. Existen dos vías para ello:

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)}"); } }

Resultado:

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

¿Como resultado quieres?


Una búsqueda rápida en la web muestra la documentación oficial de la advertencia , que viene con una explicación:

El compilador amplió y extendió implícitamente una variable, y luego utilizó el valor resultante en una operación OR a nivel de bits. Esto puede resultar en un comportamiento inesperado.

El problema es que la expresión v75 | 0x862D63D3 v75 | 0x862D63D3 es de la forma int | uint int | uint Esto se calcula mediante la promoción de ambos lados a long . Si realmente desea una extensión de signo, escriba (ulong)(long)v75 | 0x862D63D3 (ulong)(long)v75 | 0x862D63D3 . Si realmente desea una extensión cero, escriba (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); } }

Este programa imprime

ffffffff862d63d3 ffffffff862d63d3 862d63d3

Como puede ver, el compilador toma como valor predeterminado la primera interpretación, que probablemente no sea la que desea.