2010-09-27 94 views
15

Xin chào tất cả, câu hỏi nhanh: Làm thế nào để một kiểu .NET decimal được biểu diễn dưới dạng nhị phân trong bộ nhớ?Biểu diễn nhị phân của một số thập phân .NET

Chúng ta đều biết làm thế nào số dấu chấm động được lưu trữ và thusly những lý do cho sự thiếu chính xác của chúng, nhưng tôi không thể tìm thấy bất kỳ thông tin về decimal trừ như sau:

  1. Rõ ràng chính xác hơn floating- số điểm
  2. Đưa 128 bit của bộ nhớ
  3. 2^96 + đăng ký phạm vi
  4. 28 (đôi khi 29?) tổng số chữ số có nghĩa trong số

Có cách nào tôi có thể hình dung điều này không? Các nhà khoa học máy tính trong tôi đòi hỏi câu trả lời và sau một giờ nghiên cứu đã cố gắng, tôi không thể tìm thấy nó. Nó có vẻ như có rất nhiều bit lãng phí hoặc tôi chỉ hình dung điều này sai trong đầu tôi. Có ai có thể làm sáng tỏ điều này không? Cảm ơn.

Trả lời

30

Decimal.GetBits để biết thông tin bạn muốn.

Về cơ bản, nó là số nguyên 96 bit như phần định trị, cộng với bit dấu, cộng với số mũ để cho biết số lượng số thập phân các địa điểm để dịch chuyển sang phải. Vì vậy, để đại diện cho 3.261 bạn sẽ có một phần trị giá 3261, một bit dấu 0 (tức là dương), và số mũ của 3. Lưu ý rằng thập phân không được chuẩn hóa (cố tình) để bạn có thể cũng đại diện cho 3.2610 bằng cách sử dụng một mantissa 32610 và một số mũ của 4, ví dụ.

Tôi có thêm thông tin trong bài viết của mình trên decimal floating point.

+0

+1 câu trả lời tuyệt vời, phù hợp với vấn đề và thông tin phong phú. – JoshD

+0

@ Jacob: Không, đó là * rõ ràng * không đúng sự thật. Cho rằng bạn có thể bắt đầu với một số nguyên và kết thúc bằng (nói) 0,1, điều đó rõ ràng là dịch chuyển sang phải. Nếu bạn có thể * chỉ * chuyển sang bên trái, bạn có thể biểu thị 10, 100 v.v. - nhưng không phải là 0,1, 0,01. Trong tương lai, vui lòng đợi "ack" trước khi bạn thay đổi ý nghĩa của câu trả lời đáng kể như thế này. Xem tài liệu cho 'thập phân': http://msdn.microsoft.com/en-us/library/1k2e8atx.aspx - trong đó hệ số chia tỷ lệ được nói đến là * chia * số nguyên, tương đương với việc chuyển nó sang đúng. –

+0

Lời xin lỗi của tôi. Đối với tôi, nó trực quan hơn khi nghĩ về nó khi dịch chuyển dấu * dấu thập phân * sang * trái *, nhưng bây giờ tôi thấy rằng bạn đang đề cập đến việc "dịch chuyển" phần định trị. – Jacob

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