Search code examples
c#bit-manipulationcompiler-warningssuppress-warnings

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


I know these warnings are probably pointless.. But anyway I could get rid of them?

I got 7 of these warnings.

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

This has something to do with the OR operator |

I highlighted what gives off the warnings.

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

Solution

  • A quick Web search shows the official documentation for the warning, which comes with an explanation:

    The compiler implicitly widened and sign-extended a variable, and then used the resulting value in a bitwise OR operation. This can result in unexpected behavior.

    The problem is that the expression v75 | 0x862D63D3 is of the form int | uint. This is computed by promoting both sides to long. If you really want sign extension, write (ulong)(long)v75 | 0x862D63D3. If you really want zero-extension, then write (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);
     }
    }
    

    This program prints

    ffffffff862d63d3
    ffffffff862d63d3
    862d63d3
    

    As you can see, the compiler defaults to the first interpretation, which is probably not what you want.