2011-09-07 17 views
14

Tôi biết những cảnh báo này có lẽ là vô nghĩa .. Nhưng dù sao tôi có thể loại bỏ chúng?C# Bitwise hoặc toán tử được sử dụng trên toán hạng mở rộng ký hiệu; xem xét việc đúc thành loại không dấu nhỏ hơn đầu tiên

Tôi nhận được 7 trong số các cảnh báo này.

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

này có cái gì để làm với các toán tử OR |

tôi nhấn mạnh những gì phát ra những lời cảnh báo.

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

Điều này có thể gây nhầm lẫn thêm với kết hợp quần short và chữ ký đã ký và không được chỉ định - chỉ cần nghĩ về loại biểu thức phụ nào sẽ được quảng bá và làm theo lời khuyên trong câu trả lời được chấp nhận. Tập thể dục cho người đọc: thử và nhận "uint x = (<< 16) | " để biên dịch. – yoyo

Trả lời

22

Tìm kiếm trên web nhanh chóng hiển thị the official documentation for the warning, kèm theo giải thích. Vấn đề là biểu thức v75 | 0x862D63D3 có dạng int | uint. Điều này được tính bằng cách quảng bá cả hai bên thành long. Nếu bạn thực sự muốn tiện ích mở rộng đăng nhập, hãy viết (ulong)(long)v75 | 0x862D63D3. Nếu bạn thực sự muốn không có phần mở rộng, sau đó viết (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); 
} 
} 

Chương trình này in

ffffffff862d63d3 
ffffffff862d63d3 
862d63d3 

Như bạn có thể thấy, giá trị mặc định trình biên dịch đến việc giải thích đầu tiên, mà có lẽ không phải những gì bạn muốn.

+2

Tôi thấy lỗi này với 'dài | int' ... không ký/không khớp không khớp mà tôi có thể tìm thấy ... cảnh báo biến mất khi tôi đưa 'int' thành' long' một cách rõ ràng, nhưng sau đó IDE cũng thông báo cho tôi rằng diễn viên rõ ràng là "dư thừa" vì việc truyền từ 'int' sang' long' được cho là ngầm. Tôi đoán nó không thể quyết định được. :) – Giffyguy

2

Cố gắng đúc V75 và các biến là ORed với các giá trị hex unsigned để uint:

((uint)v75 | 0x862D63D3) 

hoặc khai báo các biến như uint thay vì int.

1

nếu bạn thực hiện HOẶC hoạt động cho biến int và dài, sau đó hệ thống cast int để lâu. tồn tại hai cách cho nó:

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

Kết quả:

int.MinValue = 10000000000000000000000000000000 
long.MinValue = 1000000000000000000000000000000000000000000000000000000000000000 

default cast = 1111111111111111111111111111111110000000000000000000000000000000 
custom cast = 0000000000000000000000000000000010000000000000000000000000000000 

default long OR int = 1111111111111111111111111111111110000000000000000000000000000000 
custom long OR int = 1000000000000000000000000000000010000000000000000000000000000000 

Làm thế nào kết quả mà bạn muốn?

Các vấn đề liên quan