Cái gì là cái gì? · bei.pm
Ngoài này có các bài viết về định dạng tệp và kỹ thuật đảo ngược.
Tuy nhiên, sự thật là:
Có rất nhiều ngôn ngữ lập trình và nhiều người biết đến một số thứ dưới những cái tên hoàn toàn khác - hoặc thậm chí không biết về sự tồn tại của những điều cơ bản nhất, vì ngôn ngữ lập trình của họ đã trừu tượng hóa chúng ra khỏi họ.
tóm tắt:
Cách ghi chú của tôi chủ yếu dựa trên C99 <stdint.h>
. Ai quen thuộc với cách ghi chú này sẽ dễ dàng làm quen với cách ghi chú của tôi.
Số nguyên
Integer đơn giản là các số nguyên, tức là các số không có phần thập phân.
Các số nguyên thường được định nghĩa trong các định dạng dữ liệu trong một khoảng giá trị cố định, gần như là một độ phân giải. Tôi sẽ chỉ định điều này bằng bit - vì lý do là "Byte" và các kiểu dữ liệu dựa trên nó (Word, Qword, ...) thường phụ thuộc vào nền tảng.
Hơn nữa, trong các kiểu số nguyên, cũng có sự phân biệt giữa các số tự nhiên (ℕ, tức là không có dấu - Unsigned) và các số nguyên (ℤ, tức là có dấu - Signed).
Thông tin này có thể thấy qua một dấu trong ký hiệu (u
hoặc s
).
Có thể rằng các số nguyên có dấu được biểu diễn dưới dạng bù một hoặc bù hai.
Trừ khi có chỉ định khác, bù hai sẽ được sử dụng vì đây là cách biểu diễn ưa thích trong công nghệ thông tin hiện đại.
Các số không dấu được tôi chỉ định trong các tài liệu của mình là uint
, kèm theo đó là độ chính xác trong Bits.
Các số có dấu được tôi chỉ định trong các tài liệu của mình là sint
, cũng với độ chính xác theo sau trong Bits.
Tôi không sử dụng kiểu dữ liệu "char" cho các ký tự, vì chuỗi ký tự thường chỉ là các chuỗi giá trị nguyên với một cách diễn giải đặc biệt.
Vì vậy, chúng sẽ được biểu diễn dưới dạng uint(8)[].
Ví dụ:
Ghi chú | Tương đương C99 stdint.h |
Mô tả | Phạm vi số |
---|---|---|---|
uint(16) | uint16_t | Số nguyên không dấu, độ dài 16 bit | 0 - 65.535 |
sint(8) | int8_t | Số nguyên có dấu, độ dài 8 bit, bù hai | -126 - 127 |
uint(24) | uint32_t:24 | Số nguyên không dấu, độ dài 24 bit | 0 - 16.777.216 |
Giá trị số cố định
Giá trị số cố định là các giá trị số thuộc phổ của Số hữu tỷ (Q), do đó chúng có một dấu phẩy cũng như các chữ số thập phân.
Đối với các giá trị số cố định - cũng như tên gọi - vị trí của dấu phẩy được xác định cố định bởi kiểu dữ liệu.
Điều này cũng dẫn đến một phạm vi số cố định cho các số của kiểu dữ liệu này; về mặt toán học, không gian số là hữu hạn.
Trong thực tế, kiểu dữ liệu này chủ yếu được sử dụng trên các nền tảng không có phần cứng số thực đủ nhanh, vì việc tính toán các giá trị số cố định có thể thực hiện thông qua các đơn vị số nguyên.
Kiểu dữ liệu này cũng được sử dụng bởi các hệ thống quản lý cơ sở dữ liệu, khi cần đáp ứng các yêu cầu cố định.
Có thể nghĩ đến các hệ thống lưu trữ lâu dài dữ liệu tài chính; hầu hết các loại tiền tệ giới hạn ở 2 chữ số sau dấu phẩy.
(Tuy nhiên, không khôn ngoan khi sử dụng giá trị số cố định cho điều này; khôn ngoan hơn là lưu trữ trực tiếp đơn vị tiền tệ nhỏ nhất dưới dạng số nguyên và để phần còn lại cho cấp độ biểu diễn)
Tương tự như các giá trị số nguyên, tôi chỉ định độ phân giải của số trước và sau dấu phẩy cho các giá trị số cố định:
ufixed(9,7)
chỉ định một kiểu dữ liệu, trong đó 9 bit được dành cho giá trị trước dấu phẩy, cũng như 7 bit cho giá trị sau dấu phẩy; tổng cộng là 16 bit và do đó có thể bao quát một phạm vi từ (0,0) đến (511,127) dưới dạng một vectơ của hai số nguyên độc lập nhau.
Tuy nhiên, cách diễn giải này sẽ bỏ qua 28 giá trị trong biểu diễn thập phân, vì có lẽ người ta sẽ giới hạn thực tế ở mức tối đa (511,99).
Thay vì một cách diễn giải trực tiếp giá trị số cố định như một vectơ gồm 2 số nguyên riêng biệt - điều này gần như luôn dẫn đến một vùng dữ liệu không sử dụng khi chuyển đổi thành số thập phân và một phép chuyển thủ công - có thể thay vào đó lĩnh vực sau dấu phẩy được diễn giải như một phân số của toàn bộ độ phân giải của nó.
Trong trường hợp của ufixed(9,7)
đã đề cập trên, sẽ có một phân số với mẫu số là 27 - phạm vi số sau đó sẽ từ 0,00 đến 511 + 126⁄127
Để chuyển đổi sang biểu diễn thập phân, do đó, chữ số sau dấu phẩy cần phải chia cho 128.
Với biến thể này, việc thực hiện các phép toán dễ dàng hơn, vì phép chuyển tự động xảy ra, do đó biến thể này thường được ưu tiên.
Tuy nhiên, biến thể này có nhược điểm là các chữ số thập phân trong biểu diễn thập phân không còn đảm bảo độ phân giải, một chữ số thập phân đơn lẻ không còn giá trị 0.01
, mà là 0.007874
, điều này sẽ dẫn đến các lỗi làm tròn tương ứng.
Cách diễn giải nào được sử dụng sẽ được ghi chép tại nơi sử dụng.
Các giá trị số thực hoặc số dấu phẩy động
Giá trị số thực là những biểu thức toán học phức tạp hơn, trong đó một số nguyên với độ phân giải cố định được biểu thị qua một thuật ngữ toán học sao cho phần thập phân được hình thành bằng cách dịch chuyển - và do đó hướng tới chuẩn khoa học.
Cách phổ biến nhất để thực hiện điều này đã được chuẩn hóa với
IEEE 754 và từ đó được công nhận quốc tế.
Một giá trị số thực thường bao gồm các thành phần sau:
Dấu hiệu (0 hoặc 1 ) |
Chỉ số | Phần mantissa |
Trong khi dấu hiệu có thể được xác định đơn giản như thông tin nhị phân Có/Không, số thực được hình thành qua phương trình
Phần mantissa * 2Chỉ số
Thêm vào đó, còn có một loạt các giá trị hằng số che phủ các trường hợp đặc biệt của số hữu tỷ - bao gồm cả ±∞
và NaN
("không phải là số hợp lệ").
Giá trị số thực đặc biệt hữu ích khi độ chính xác không quan trọng lắm, vì loại giá trị này có thể dẫn đến lỗi làm tròn và do đó mất chính xác. Thường thì giá trị số thực được sử dụng để định nghĩa các tọa độ, chẳng hạn như các vector đỉnh trong mô hình 3D hoặc đường Bézier/đường spline cho các mục đích biểu diễn quang học.
Trong các định dạng dữ liệu, giá trị số thực được chỉ định là float(Phần mantissa, Chỉ số)
.
Nếu một định dạng khác với IEEE 754 được sử dụng, điều này sẽ được chỉ rõ.