2012-06-25 26 views
10

Tôi có một loại là sbyte và muốn sao chép nội dung sang một số byte. Việc chuyển đổi sẽ không phải là một chuyển đổi giá trị, thay vì một chút cho mỗi bản sao bit.Chuyển đổi sbyte thành byte

Ví dụ,

nếu mySbyte theo bit là: '10.101.100', sau khi chuyển đổi, biến byte tương ứng cũng sẽ chứa '10.101.100' bit.

+2

Tại sao không chỉ truyền nó sang 'byte'? – V4Vendetta

+0

@ V4Vendetta: Nó có hoạt động không, tôi đã đọc ở đâu đó nếu giá trị nằm ngoài phạm vi, điều đó âm tính với sbyte, sẽ ném ngoại lệ. –

+0

Cũng không thực sự nói -1 của nó sau đó bạn sẽ nhận được nó như 255 – V4Vendetta

Trả lời

4
unchecked 
{ 
    sbyte s; 
    s= (sbyte)"your value"; 
    byte b=(byte)s; 
} 

Thông tin thêm về uncheckedhere

4

như thế này:

sbyte sb = 0xFF; 
byte b = unchecked((byte)sb); 
3
unchecked 
{ 
    sbyte s = (sbyte)250; //-6 (11111010) 
    byte b = (byte)s; //again 250 (11111010) 
} 
+0

Đã thêm làm rõ, ý nghĩa của việc bỏ chọn được sử dụng ở đây là gì? –

+4

Vì 250 vượt quá phạm vi của sbyte (-128 - 127) cần phải có một chuyển đổi không được kiểm tra. –

15

Hãy để tôi làm rõ việc kinh doanh unchecked. Các MSDN page tiểu bang rằng unchecked được sử dụng để ngăn chặn kiểm tra tràn, mà nếu không, khi bên trong một ngữ cảnh được kiểm tra, cung cấp cho một lỗi biên dịch hoặc ném một ngoại lệ.

... NẾU bên trong ngữ cảnh được chọn.

Bối cảnh được kiểm tra hoặc rõ ràng:

checked { ... } 

hoặc ngầm *, khi giao dịch với thời gian biên dịch hằng:

byte b = (byte)-6; //compile error 
byte b2 = (byte)(200 + 200); //compile error 

int i = int.MaxValue + 10; //compiler error 

Nhưng khi giao dịch với runtime biến, bối cảnh là unchecked theo mặc định **:

sbyte sb = -6; 
byte b = (byte)sb; //no problem, sb is a variable 


int i = int.MaxValue; 
int j = i + 10; //no problem, i is a variable 

Để tóm tắt và trả lời các câu hỏi ban đầu:

Cần byte<->sbyte chuyển đổi trên hằng? Sử dụng unchecked và dàn diễn viên:

byte b = unchecked((byte) -6); 

Cần byte<->sbyte chuyển đổi trên biến? Chỉ cần đúc:

sbyte sb = -6; 
byte b = (byte) sb; 

* Có một cách thứ ba để có được một bối cảnh kiểm tra theo mặc định: bằng cách tinh chỉnh các thiết lập trình biên dịch. Ví dụ. Visual Studio -> properties Project -> Build -> Advanced ... -> [X] Kiểm tra số học tràn/underflow

** Bối cảnh thời gian chạy được bỏ chọn theo mặc định trong C#. Trong VB.NET chẳng hạn, ngữ cảnh thời gian chạy mặc định được kiểm tra.