2010-10-30 22 views
6

tôi có thể không có vẻ để thoát khỏi cảnh báo này cho các dòng mã sau đây:Làm thế nào để đàn áp C CS0675 # cảnh báo: Bitwise-hoặc nhà điều hành được sử dụng trên một toán hạng đăng nhập mở rộng

d.word[wrdIndex++] = d.GetWord(english) | (ulong)i; 

cảnh báo áp dụng cho mã sau toán tử gán. phương pháp GetWord trả về một ulong. Tôi đã thử những điều sau đây để không có kết quả:

d.word[wrdIndex++] = (d.GetWord(english) | (ulong)i); 
d.word[wrdIndex++] = d.GetWord(english) | ((ulong)i); 
d.word[wrdIndex++] = ((ulong)d.GetWord(english)) | ((ulong)i); 

Bất kỳ ai có ý tưởng?

Trả lời

17

CẬP NHẬT: Câu hỏi này là chủ đề của blog của tôi vào thứ hai ngày 29 tháng 11 năm 2010:

http://blogs.msdn.com/b/ericlippert/archive/2010/11/29/bit-twiddling-what-does-warning-cs0675-mean.aspx

Cảm ơn câu hỏi tuyệt vời!


Bạn thoát khỏi cảnh báo bằng cách suy nghĩ đầu tiên về cảnh báo và quyết định xem trình biên dịch có đúng là đưa vấn đề của bạn vào vị trí đầu tiên không! Bạn có thực sự sẽ nhận được kết quả không chính xác từ bitwise hoặc nên chuyển đổi từ một loại đã ký thành một loại chưa ký lớn hơn, hãy mở rộng số nguyên?

Nếu câu trả lời là thì giải pháp của bạn là sai. Không loại bỏ các cảnh báo bằng cách lừa các trình biên dịch vào vẫn làm điều sai trái mà không cho bạn những cảnh báo. Loại bỏ các cảnh báo bằng cách làm điều đúng: không sử dụng một chuyển đổi mà ký-kéo dài số nguyên.

Nếu câu trả lời là không và bạn muốn phần mở rộng dấu hiệu thì giải pháp của bạn hoặc giải pháp Hans Passant là chính xác. Tuy nhiên, tôi sẽ đưa ra nhận xét về hiệu ứng đó trong mã, bởi vì khi nó đứng, thật khó để thấy rằng phần mở rộng dấu hiệu là mong muốn.

+0

Mã chắc chắn làm những gì cần (và đây là cách đúng để làm những gì tôi muốn trong trường hợp này tôi nghĩ) - Tôi chỉ ngạc nhiên rằng lần thứ 2 của 3 lần thử: d.GetWord (tiếng Anh) | ((ulong) i) vẫn đưa ra cảnh báo khi ((ulong) i) được đúc thành một ulong trước khi toán tử OR bitwise được áp dụng, đúng không? –

+1

Ah, bây giờ tôi hiểu - nó thực sự khá thông minh của trình biên dịch để cảnh báo tôi về điều này tôi đoán. Có cách nào để đúc để ulong mà không có phần mở rộng dấu (khác hơn là bằng cách che off bit đầu bằng tay)? –

+1

truyền đến đầu tiên. '(ulong) (uint) i' – CodesInChaos

2

Xin lỗi, chỉ cần đã thoát khỏi nó thusly:

ulong w = d.GetWord(english); 
ulong u = (ulong)i; 
d.word[wrdIndex++] = w | u; 
+0

Như đã chỉ ra ở trên, nếu 'i' là số âm, mã của bạn sẽ bị ngắt (vì phần còn lại của' u' sẽ chứa 0xFFFFFFFF và do đó giá trị 'd.GetWord (english)' sẽ bị mất hoàn toàn thay vì kết hợp với 'i'). – MrCranky

6
int i=-1;     // =   0xFFFFFFFF 
ulong u1=(ulong)i;  // = 0xFFFFFFFFFFFFFFFF 
ulong u1a=(ulong)(long)i; // = 0xFFFFFFFFFFFFFFFF 
ulong u2=(ulong)(uint)i; // = 0x00000000FFFFFFFF 

Vì vậy, một diễn viên từ int đến ulong tương ứng với dấu hiệu mở rộng đầu tiên đến (đã ký) lâu, sau đó bỏ đi biển báo.

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