2016-05-25 17 views
5

Tôi hiện đang đọc một cuốn sách về lập trình C# và nó có phần giới thiệu ngắn gọn về tràn và phần dưới và người viết đưa ra ý tưởng chung về những gì xảy ra khi bạn đi qua phạm vi cho phép của một loại nhất định.Ai đó có thể giải thích tràn trong C# bằng cách sử dụng nhị phân?

Ví dụ

short a = 30000; 
short b = 30000; 
short sum = (short)(a + b); // Explicitly cast back into short 
Console.WriteLine(sum); // This would output the value -5536 

Vì vậy, loại ngắn chỉ có một loạt các -32.768-32.767 và trong cuốn sách giải thích được đưa ra bởi nhà văn là "Đối với các loại nguyên (byte, short, int, và dài), các bit quan trọng nhất (bị tràn) bị loại bỏ, điều này đặc biệt lạ, khi máy tính sau đó diễn giải nó xung quanh, đây là lý do tại sao chúng ta kết thúc với một giá trị âm trong ví dụ của chúng ta. bạn bắt đầu với giá trị tối đa cho một loại cụ thể (ví dụ: short.MaxValue) và thêm một giá trị cho nó. " Hướng dẫn chơi C# Phiên bản thứ hai, chương 9, trang 58

Bạn sẽ kết thúc ở mức tối thiểu (-32768).

Tôi đang gặp một vấn đề hiểu biết này, tôi bị lẫn lộn khi các cuộc đàm phán về nhà văn "máy tính diễn giải nó như quấn quanh"

Con đường tôi đã cố gắng tìm hiểu này là loại ngắn sử dụng 2 byte (16 bit)

Vì vậy, số 32767 = 0111111111111111 nếu tôi +1 đến chuỗi nhị phân, tôi sẽ kết thúc với 32768 = 1000000000000000 (không thể được thể hiện bằng loại ngắn là giá trị tối đa là 32767) trình biên dịch cho -32768. Tại sao nó kết thúc như một tiêu cực?

Tôi hiểu khái niệm sử dụng twos để đại diện cho số âm và có thể ai đó sửa suy nghĩ của tôi ở đây hoặc phức tạp vì tôi không hiểu đầy đủ lý do tại sao chúng tôi chỉ sử dụng 15 bit của 16 bit để thể hiện phạm vi tích cực và nhiều nhất bit quan trọng cho phạm vi phủ định

+1

Bạn quên mất tài khoản cho bit dấu. –

+0

Tôi không hiểu :(, bạn có thể giải thích được không? – Shabubble

+0

Trên các giá trị đã ký, một bit (MSB) được dành riêng làm bit dấu, để cho biết số có dương hay âm hay không. có phải là số âm hay không? Bạn không cần phải tính toán số bit cần phải có mặt –

Trả lời

16

Bỏ qua tất cả những người đang nói với bạn rằng bit trên cùng là bit dấu. Đó là cách sai lầm để suy nghĩ về nó.

Cách đúng để suy nghĩ về nó là:

  • Chúng tôi có 65.536 mẫu bit có thể.
  • Vì vậy, chúng tôi có thể đại diện cho 65536 số có thể.
  • Chúng tôi phải có một bản đồ gán có nghĩa là cho mỗi mẫu bit.

Đối với quần short unsigned, chúng ta gán mẫu bit như sau:

0000000000000000 --> 0 
0000000000000001 --> 1 
... 
0111111111111111 --> 32767 
1000000000000000 --> 32768 
1000000000000001 --> 32769 
... 
1111111111111111 --> 65535 

Đối quần short, chúng tôi sử dụng quy ước sau:

0000000000000000 --> 0 
0000000000000001 --> 1 
... 
0111111111111111 --> 32767 
1000000000000000 --> -32768 
1000000000000001 --> -32767 
... 
1111111111111111 --> -1 

đơn giản như vậy.

Tại sao chúng ta sử dụng quy ước này?

Ba lý do:

(1) Các 32K giá trị đầu tiên là như nhau cho dù bạn đang ký kết hoặc unsigned. Điều đó rất thuận tiện.

(2) Trong cả hai quy ước, "tất cả bit không" có nghĩa là không.

(3) Vì tính năng bổ sung hoạt động chính xác như nhau trong cả hai quy ước!

Chúng tôi có

0000000000000000 --> 0 

và chúng tôi muốn thêm một. Chúng tôi thêm một bằng cách sử dụng quy tắc nhị phân và chúng tôi nhận được:

0000000000000001 --> 1 

Điều này hoạt động cho dù đoạn mã ngắn được ký hoặc chưa ký.

Chúng tôi có unsigned ngắn:

1000000000000000 --> 32768 

Chúng tôi muốn thêm một. Chúng tôi làm như vậy bằng cách sử dụng quy tắc nhị phân và chúng tôi nhận được câu trả lời đúng:

1000000000000001 --> 32769 

Tương tự cho quần short có chữ ký. Chúng tôi có

1000000000000000 --> -32768 

và chúng tôi muốn thêm. Chúng tôi làm như vậy với quy tắc nhị phân và chúng tôi nhận được:

1000000000000001 --> -32767 

Tương tự như vậy, bạn có thể xác minh rằng bằng cách thêm 1111111111111111 cho bất kỳ số nhị phân, bạn nhận được "một ít", và do đó trừ của một công trình cũng như bổ sung một . Sau đó bạn có thể tiếp tục cho thấy rằng nói chung, phép cộng và phép trừ giống nhau trong cả số học đã ký và unsigned, có nghĩa là bộ vi xử lý không phải biết trình biên dịch có nghĩ rằng các giá trị được ký hoặc không được ký.

Đó là lý do tại sao chúng tôi sử dụng bổ sung twos: vì toán cơ bản giống hệt nhau cho dù bạn đang thực hiện số học đã ký hoặc chưa ký.

Lưu ý rằng tôi không nói gì về "bit dấu" trong đó. Thực tế là bit cao được thiết lập cho số âm chỉ là một phần thưởng tốt đẹp. Bất động sản chúng tôi muốn là chỉ phải xây dựng phần cứng để làm toán một lần.

Bổ sung Twos là chỉ là một quy ước để gán một trong hai ý nghĩa có thể cho các mẫu bit dựa trên loại được liên kết với biến giữ mẫu bit. Là một ngành, chúng tôi đã chọn quy ước này bởi vì nó rẻ để tạo ra phần cứng hiệu suất cao sử dụng quy ước này.

Có rất nhiều công ước khác mà chúng tôi có thể đã chọn. Ví dụ, chúng ta có thể nói rằng đối với số ký chúng tôi sử dụng bản đồ:

0000000000000000 --> -32768 
0000000000000001 --> -32767 
... 
0111111111111111 --> -1 
1000000000000000 --> 0 
1000000000000001 --> 1 
... 
1111111111111111 --> 32767 

Chú ý rằng đây là chính xác giống như trước trừ các bit đầu!

Trong cách diễn giải này, việc thêm vẫn hoạt động như chúng tôi mong đợi. Nhưng bản đồ này không có tài sản mà các giá trị 32K đầu tiên là giống nhau giữa ngắn và ushort, và nó không có tài sản mà tất cả các bit bằng không có nghĩa là số không. Vì vậy, chúng tôi không sử dụng quy ước này, bởi vì nó là ít thuận tiện hơn. Trong quy ước này, việc chuyển đổi từ ngắn thành ushort sẽ yêu cầu bổ sung. Đặt giá trị ngắn thành 0 sẽ yêu cầu đặt byte thành thứ khác 0. Chúng ta có thể sử dụng một quy ước nơi các con số đã ký được "theo thứ tự", chúng ta không chỉ vì nó là đau đớn để làm như vậy.

+0

Giải thích tuyệt vời có ý nghĩa hơn rất nhiều :) Tôi gặp khó khăn khi hiểu "Giá trị 32K đầu tiên giống nhau cho dù bạn đã ký hoặc chưa ký." – Shabubble

+0

Chờ tôi nghĩ rằng tôi biết 1000000000000000 -> 32768 và 1000000000000000 -> -32768 có cả hai mẫu bit giống nhau, tôi không thấy điều đó trước – Shabubble

+0

@Shabubble: Mẫu bit cho 123 có chữ ký ngắn là gì? Mô hình bit cho 123 trong một dấu ngắn không? Họ giống nhau. Trên thực tế, tất cả đều giống nhau, phải lên đến 32767. –

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