2009-05-29 35 views
15

tôi phải đoạn mã sau trong VS2008 .net 3.5 sử dụng WinForms:Tại sao một diễn viên được yêu cầu cho phép trừ byte trong C#?

byte percent = 70; 
byte zero = 0; 

Bitmap copy = (Bitmap)image1.Clone(); 
... 

Color oColor = copy.GetPixel(x, y); 
byte oR = (byte)(oColor.R - percent < zero ? zero : oColor.R - percent); 

Khi tôi rời khỏi "(byte)" tắt dòng cuối cùng của mã này, tôi nhận được một lỗi biên dịch nói rằng nó "có thể không mặc nhiên chuyển đổi các loại 'int' đến 'byte'. " Nếu mọi thứ thuộc loại bytebyte là một loại số nguyên ... thì tại sao tôi cần phải có dàn diễn viên?

+6

Eric Lippert nói, "Tôi không nghĩ byte là" số ", tôi nghĩ chúng là các mẫu bit có thể được _interpreted_ dưới dạng số, hoặc ký tự hoặc màu hoặc bất kỳ thứ gì. làm toán trên chúng và xử lý chúng dưới dạng số, sau đó nó có ý nghĩa để di chuyển kết quả vào một kiểu dữ liệu thường được hiểu là một số. " Xem http://stackoverflow.com/questions/941584/byte-byte-int-why-c. – Brian

+5

Các bạn nhận ra rằng bạn đã đánh dấu mục này là trùng lặp mặc dù nó được hỏi * trước * liên kết "đã có câu trả lời ở đây"? –

+0

Địa ngục, bây giờ nó thậm chí còn nói "hỏi trước" mặc dù câu hỏi khác đã được hỏi ba năm sau đó. –

Trả lời

15

Vì phép trừ được kéo lên đến một số nguyên. Khi tôi nhớ lại, byte là một kiểu unsigned trong C#, do đó phép trừ có thể đưa bạn ra khỏi miền byte.

+1

Phép trừ có thể đưa bạn ra khỏi miền của mọi loại số. Điều đó không thực sự giải thích tại sao không có toán tử trừ byte cụ thể. –

+0

Vâng, sau đó, câu trả lời là "bởi vì các nhà phát triển của C# quyết định họ không muốn một." –

2

Điều này là do số byte trừ trả về int. Trên thực tế, bất kỳ phép tính số học nhị phân nào trên bytes sẽ trả lại một số int, do đó, cần phải thực hiện.

+0

Tôi nghĩ rằng đó là phép trừ, thực sự .... –

+0

Rất tiếc - cảm ơn Charlie, tôi đã sửa nó. –

+0

Có lý do nào cho phiếu giảm giá không? –

9

Arithmetic on bytes dẫn đến giá trị int theo mặc định.

+0

Liên kết đã chết ... –

4

Vì số học trên byte trả về số nguyên theo mặc định, do đó, có thể gán hai kiểu số không nhỏ hơn (byte) vào int (của oColor.r - phần trăm). Vì vậy, loại hoạt động là một int. Trình biên dịch sẽ không, mà không có một diễn viên, cho phép bạn gán một loại rộng hơn cho một loại hẹp hơn, bởi vì nó là một hoạt động mất mát. Do đó bạn nhận được lỗi, trừ khi bạn nói rõ ràng "Tôi biết tôi đang mất một số dữ liệu, nó là tốt" với dàn diễn viên.

10

Đó là bởi vì kết quả của một phép trừ byte không phù hợp trong một byte:

byte - byte = (0..255) - (0..255) = -255..255 
+1

Thật là một lời giải thích đồ họa đẹp! –

+17

Không có bất kỳ loại số nguyên nào ngoại trừ phao hoặc số thập phân. int là phạm vi hữu hạn quá, vì vậy (min_int - max_int) không phù hợp, nhưng nó trả về một int. –

+2

@Adam: 1) phao và số thập phân không phải là loại số nguyên. 2) Kết quả của phép trừ cho những cũng có thể không phù hợp, vì chúng cũng có một phạm vi hữu hạn (mặc dù lớn). – Brian

1

Bởi vì biểu thức số học ở phía bên tay phải của toán tử gán để đánh giá int theo mặc định. Trong ví dụ của bạn percent mặc định là int. Bạn có thể đọc thêm về nó trên MSDN page.

2

Bởi vì phép tính số học trên sbyte, byte, ushort và short được tự động chuyển đổi thành int. Lý do chính đáng nhất cho việc này là các hoạt động như vậy có khả năng tràn hoặc tràn.

Vì vậy, trong hoạt động ba năm của bạn, oColor.R - phần trăm cuối cùng, thực sự dẫn đến int, không phải byte. Vì vậy, kiểu trả về của phép toán là int.

0

FWIW, java cũng quảng bá byte thành int.

1

Cố gắng chạy mã C# này: đối tượng o = (byte) (1); o = (int) o; Bạn mong đợi điều gì? Bây giờ hãy thử :)

Tôi nghĩ rằng đây là đúng:

Eric Lippert cho biết: "Tôi không nghĩ rằng byte là 'số', tôi nghĩ về họ như mô hình của các bit có thể là Nếu bạn định làm toán trên chúng và coi chúng như là các con số, thì có nghĩa là di chuyển kết quả vào một kiểu dữ liệu thường được hiểu là một số. "

Có lẽ byte gần char hơn so với int.

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