Apa itu? · bei.pm
Di rubrik ini terdapat artikel tentang format file dan rekayasa balik.
Tapi begini:
Ada banyak bahasa pemrograman di luar sana dan banyak orang yang mengenal beberapa hal dengan nama yang sama sekali berbeda - atau bahkan tidak tahu tentang keberadaan hal-hal yang paling mendasar, karena bahasa pemrograman mereka mengabstraksikannya.
tl;dr:
Notasi saya secara umum mengacu pada C99 <stdint.h>
. Siapa pun yang bisa memahami notasi ini pasti akan dapat mengerti notasi saya.
Integer
Integer adalah angka bulat, yaitu angka tanpa bagian desimal.
Integer biasanya didefinisikan dalam format data dalam rentang angka tetap, yang bisa dianggap sebagai resolusi. Saya menyebutkan ini dalam bit - karena "Byte" dan tipe yang dibangun di atasnya (Word, Qword, ...) umumnya bergantung pada platform.
Selain itu, ada juga perbedaan antara bilangan alami (ℕ, yaitu, tanpa tanda - Unsigned) dan bilangan bulat (ℤ, yaitu, dengan tanda - Signed).
Informasi ini dapat dilihat melalui tanda di dalam penanda (u
atau s
).
Adapun bilangan bulat signed dapat direpresentasikan sebagai komplement satu atau sebagai komplement dua.
Selama tidak dinyatakan lain, komplement dua yang digunakan, karena ini adalah representasi yang lebih disukai dalam ilmu komputer modern.
Saya menyatakan angka tanpa tanda dalam dokumentasi saya sebagai uint
, diikuti dengan keterangan presisi dalam Bits.
Angka dengan tanda dinyatakan dalam dokumentasi saya sebagai sint
, juga diikuti dengan keterangan presisi dalam Bits.
Saya tidak menggunakan tipe data "char" untuk karakter, karena string biasanya hanya mewakili rangkaian nilai integer dengan interpretasi khusus.
Oleh karena itu, ini dinyatakan sebagai uint(8)[].
Contoh:
Notasi | C99 stdint.h -Ekuivalen |
Deskripsi | Ruang Angka |
---|---|---|---|
uint(16) | uint16_t | Integer Tak Bertanda, Panjang 16 Bit | 0 - 65.535 |
sint(8) | int8_t | Integer Bertanda, Panjang 8 Bit, Komplement Dua | -126 - 127 |
uint(24) | uint32_t:24 | Integer Tak Bertanda, Panjang 24 Bit | 0 - 16.777.216 |
Nilai Desimal Tetap
Bilangan tetap adalah nilai numerik dari spektrum Bilangan Rasional (Q), yang dengan demikian memiliki titik desimal serta angka desimal.
Pada bilangan tetap, posisi titik desimal - yang juga menjadi nama tersebut - ditentukan secara tetap oleh tipe data.
Ini juga menghasilkan rentang angka tetap untuk angka dari tipe data ini; secara matematis, ruang angka ini adalah terbatas.
Dalam praktiknya, tipe data ini digunakan terutama pada platform yang tidak memiliki unit perangkat keras floating-point yang cukup cepat, karena perhitungan bilangan tetap dapat dilakukan oleh unit integer.
Tipe data ini juga digunakan, misalnya, oleh sistem manajemen basis data ketika persyaratan tetap harus dipenuhi.
Contohnya adalah sistem untuk penyimpanan data keuangan secara permanen; sebagian besar mata uang membatasi hingga 2 angka setelah titik desimal.
(Tetapi tidak bijaksana untuk menggunakan bilangan tetap untuk ini; lebih cerdas untuk menyimpan unit mata uang terkecil sebagai integer dan menyerahkan sisa level representasi)
Sama seperti penentuan integer, pada bilangan tetap saya memberikan resolusi angka sebelum dan setelah titik desimal:
ufixed(9,7)
menunjukkan tipe data yang tidak bertanda, yang mengalokasikan 9 bit untuk nilai sebelum titik desimal, serta 7 bit untuk nilai setelah titik desimal; totalnya berarti lebar 16 bit dan dapat mencakup rentang (0,0) hingga (511,127) sebagai vektor dari dua integer yang independen satu sama lain.
Penafsiran ini, bagaimanapun, akan menyia-nyiakan 28 angka dalam representasi decimal, karena dalam praktiknya orang cenderung membatasi hingga maksimum (511,99).
Alih-alih penafsiran langsung dari bilangan tetap sebagai vektor dari 2 integer terpisah - yang hampir selalu berarti ada area data yang tidak terpakai saat dikonversi ke angka desimal dan membutuhkan transfer manual - bagian angka desimal juga dapat ditafsirkan sebagai pecahan dari total resolusi mereka.
Dari contoh ufixed(9,7)
yang baru disebutkan, maka diperoleh pecahan dengan penyebut sebesar 27 - rentang angka kemudian dari 0,00 hingga 511 + 126⁄127
Untuk mengubahnya ke dalam representasi desimal, angka desimal harus dibagi dengan 128.
Dengan varian ini, operasi perhitungan dapat dilakukan lebih mudah, karena transfer terjadi secara otomatis, sehingga varian ini biasanya diutamakan.
Namun, varian ini memiliki kelemahan bahwa angka desimal dalam representasi desimal tidak lagi memiliki resolusi yang terjamin, sehingga satu angka desimal tidak lagi setara dengan 0.01
, tetapi 0.007874
, yang akan menyebabkan kesalahan pembulatan yang sesuai.
Penafsiran yang digunakan akan didokumentasikan sesuai dengan lokasi penggunaannya.
Nilai Float atau Gleitkomma
Nilai floating point adalah ungkapan matematis yang lebih kompleks, di mana sebuah bilangan bulat dengan resolusi tetap dinyatakan melalui sebuah istilah matematis sehingga bagian desimalnya secara efektif dibentuk melalui pergeseran - dan dengan demikian langsung berorientasi pada notasi ilmiah.
Cara yang paling umum untuk mengimplementasikannya telah distandardisasi dengan
IEEE 754 dan sejak saat itu diakui secara internasional.
Sebuah nilai floating point biasanya terdiri dari komponen-komponen berikut:
Tanda (0 atau 1 ) |
Eksponen | Mantissa |
Sementara tanda dapat dengan mudah ditentukan sebagai informasi biner Ya/Tidak, angka yang sebenarnya dibentuk melalui persamaan
Mantissa * 2Eksponen
Selain itu, ada sejumlah nilai konstan yang mencakup kasus khusus angka rasional - termasuk ±∞
dan NaN
("bukan angka yang valid").
Nilai floating point sangat berguna ketika akurasi tidak begitu penting, karena pada jenis nilai ini tidak dapat dihindari terjadi kesalahan pembulatan yang menyebabkan kehilangan akurasi. Umumnya, nilai floating point digunakan misalnya untuk mendefinisikan koordinat, seperti vektor titik dalam model 3D atau kurva Bézier/Spline untuk tujuan representasi visual.
Dalam format data, nilai floating point didefinisikan sebagai float(Mantissa, Eksponen)
.
Jika format yang digunakan menyimpang dari IEEE 754, maka ini akan dinyatakan dengan jelas.