Ini masalah cara data disimpan. Interaksi Anda dengan Sam akan membuat perbandingan yang lebih baik jika Anda bertanya sehingga Anda dapat menuliskannya tetapi hanya memiliki kertas bernilai delapan karakter.
"Sam, beri aku nomor teleponnya."
"5555555555"
"Oh, tidak, aku kehabisan kertas. Kalau saja aku tahu sebelumnya berapa banyak data yang aku minta aku bisa mempersiapkan diri dengan lebih baik!"
Jadi sebagai gantinya, sebagian besar bahasa membuat Anda mendeklarasikan suatu jenis, sehingga ia akan tahu dan mempersiapkan sebelumnya:
"Sam, berapa lama nomor teleponnya?"
"Sepuluh karakter."
"Oke, kalau begitu biarkan aku mengambil selembar kertas yang lebih besar. Sekarang beri aku nomor telepon."
"5555555555"
"Mengerti! Terima kasih, Sam!"
Itu menjadi lebih hairier ketika Anda melihat cara mendasar sebenarnya bahwa data disimpan. Jika Anda seperti saya, Anda memiliki buku catatan dengan catatan lain-lain, angka-angka hanya dicoret, tidak ada konteks atau pelabelan untuk apa pun, dan Anda tidak tahu apa arti semua itu tiga hari kemudian. Ini juga masalah bagi komputer. Banyak bahasa memiliki tipe "int" (int, panjang, pendek, byte) dan "float" (float, double). Mengapa itu perlu?
Baiklah pertama-tama mari kita lihat bagaimana sebuah integer disimpan, dan umumnya direpresentasikan di dalam komputer. Anda mungkin menyadari bahwa pada tingkat dasar, semuanya biner (1 dan 0). Binary sebenarnya adalah sistem angka yang bekerja persis seperti sistem angka desimal kami. Dalam desimal, Anda menghitung 0 hingga 9 (dengan nol terkemuka yang tersirat tak terhingga yang tidak Anda tulis), lalu Anda putar kembali ke 0 dan menambah angka berikutnya sehingga Anda memiliki 10. Anda mengulangi hingga berguling dari 19 hingga 20, ulangi sampai Anda berguling dari 99 hingga 100, dan seterusnya.
Biner tidak berbeda, kecuali bahwa bukannya 0 hingga 9, Anda menghitung 0 hingga 1. 0, 1, 10, 11, 100, 101, 110, 111, 1000. Jadi ketika Anda mengetikkan 9, dalam memori yang direkam dalam biner sebagai 1001. Ini adalah angka aktual. Itu dapat ditambahkan, dikurangi, dikalikan, dll, persis dalam bentuk itu. 10 + 1 = 11. 10 + 10 = 100 (gulung 1 ke 0 dan bawa 1). 11 x 10 = 110 (dan setara, 11 + 11 = 110).
Sekarang di memori aktual (termasuk register), ada daftar, larik, apa pun yang Anda ingin menyebutnya, bit (potensial 1 atau 0 ') tepat di samping satu sama lain, yaitu bagaimana ia membuat bit-bit ini diatur secara logis untuk membuat angka lebih besar dari 1. Masalahnya adalah, apa yang Anda lakukan dengan desimal? Anda tidak bisa begitu saja memasukkan perangkat keras di antara dua bit dalam register, dan akan terlalu mahal untuk menambahkan "bit desimal" di antara setiap pasangan bit. Jadi apa yang harus dilakukan?
Anda menyandikannya. Secara umum, arsitektur CPU atau perangkat lunak akan menentukan bagaimana hal ini dilakukan, tetapi satu cara yang umum adalah menyimpan tanda (+ atau -, umumnya 1 negatif) di bit pertama register, mantissa (nomor Anda bergeser Namun berkali-kali perlu untuk menghilangkan desimal) untuk jumlah bit X berikut, dan eksponen (berapa kali Anda harus menggesernya) untuk sisanya. Ini mirip dengan notasi ilmiah.
Mengetik memungkinkan kompiler mengetahui apa yang dilihatnya. Bayangkan Anda menyimpan nilai 1.3 dalam register 1. Kami hanya akan datang dengan skema pengkodean mewah kami sendiri di sini, 1 bit untuk tanda, 4 untuk mantissa, 3 untuk eksponen (1 bit untuk tanda, 2 untuk besarnya). Ini adalah angka positif, jadi tandanya positif (0). Mantera kita adalah 13 (1101) dan eksponen kita adalah -1 (101 (1 untuk negatif, 01 = 1)). Jadi kita menyimpan 01101101 dalam register 1. Sekarang kita tidak mengetik variabel ini, jadi ketika runtime mulai menggunakannya, ia mengatakan "yakin, ini adalah bilangan bulat mengapa tidak" jadi ketika mencetak nilai yang kita lihat 109 (64 + 32 + 8 + 4 + 1), yang jelas tidak benar.
Namun, tidak semua bahasa mengharuskan Anda mengetik secara eksplisit. C # memiliki kata kunci "var" yang menyebabkan tipe variabel ditafsirkan pada waktu kompilasi, dan bahasa lain seperti Javascript diketik secara dinamis sepenuhnya, ke titik di mana Anda dapat menyimpan integer dalam suatu variabel, kemudian menetapkannya ke boolean, lalu menetapkan kembali ke string dan bahasa melacak semuanya.
Tetapi jauh lebih mudah pada kompiler, interpreter, atau runtime - dan seringkali menghasilkan program yang lebih cepat karena tidak perlu menghabiskan sumber daya berharga untuk mengetik semuanya - untuk bertanya kepada Anda, programmer, seperti apa data yang Anda berikan.