Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

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); 
like image 301
SSpoke Avatar asked Sep 07 '11 01:09

SSpoke


2 Answers

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.

like image 151
Raymond Chen Avatar answered Sep 25 '22 18:09

Raymond Chen


Try casting v75 and other variables being ORed with unsigned hex values to uint:

((uint)v75 | 0x862D63D3) 

or declare the variables as uint instead of int.

like image 34
BlueMonkMN Avatar answered Sep 22 '22 18:09

BlueMonkMN