To kwestia sposobu przechowywania danych. Twoja interakcja z Samem byłaby lepszym porównaniem, gdybyś poprosił, żebyś mógł to zapisać, ale miał tylko osiem znaków papieru.
„Sam, daj mi numer telefonu”.
„5555555555”
„Och nie, zabrakło mi papieru. Gdybym tylko wiedział z wyprzedzeniem, o ile danych proszę, mógłbym się lepiej przygotować!”
Zamiast tego większość języków sprawia, że deklarujesz typ, więc będzie wiedział i przygotuje się z wyprzedzeniem:
„Sam, jak długi jest numer telefonu?”
„Dziesięć znaków”.
„Ok, pozwól mi wziąć większy kawałek papieru. Teraz daj mi numer telefonu”.
„5555555555”
„Rozumiem! Dzięki Sam!”
Staje się jeszcze bardziej włochaty, kiedy spojrzysz na rzeczywiste podstawowe sposoby przechowywania danych. Jeśli jesteś podobny do mnie, masz zeszyt z różnymi notatkami, po prostu zapisanymi cyframi, bez kontekstu lub etykietowania czegokolwiek i nie masz pojęcia, co to znaczy trzy dni później. Jest to często problem również dla komputerów. Wiele języków ma typy „int” (int, długi, krótki, bajt) i „float” (float, double). Dlaczego to konieczne?
Cóż, najpierw spójrzmy, jak liczba całkowita jest przechowywana i ogólnie reprezentowana w komputerze. Prawdopodobnie zdajesz sobie sprawę, że na poziomie podstawowym wszystko jest binarne (1 i 0). Binarny to w rzeczywistości system liczbowy, który działa dokładnie tak jak nasz system liczb dziesiętnych. W systemie dziesiętnym liczy się od 0 do 9 (z nieskończonymi domniemanymi zerami na początku, których nie piszesz), a następnie przewijasz z powrotem do 0 i zwiększasz kolejną cyfrę, tak abyś miał 10. Powtarzaj, aż przejdziesz z 19 do 20, powtarzaj, aż przejdziesz od 99 do 100 itd.
Binarny nie jest inny, z wyjątkiem tego, że zamiast 0 do 9, liczysz od 0 do 1. 0, 1, 10, 11, 100, 101, 110, 111, 1000. Więc kiedy wpiszesz 9, w pamięci zapisanej w binarnym jako 1001. Jest to liczba rzeczywista. Można go dodawać, odejmować, mnożyć itp. W dokładnie takiej formie. 10 + 1 = 11. 10 + 10 = 100 (przewiń 1 na 0 i przenieś 1). 11 x 10 = 110 (i równoważnie, 11 + 11 = 110).
Teraz w rzeczywistej pamięci (łącznie z rejestrami) znajduje się lista, tablica, jakkolwiek chcesz to nazwać, bitów (potencjalne 1 lub 0 ') tuż obok siebie, w ten sposób logicznie zorganizowane te bity tworzą liczba większa niż 1. Problem polega na tym, co robisz z miejscami po przecinku? Nie można po prostu wstawić elementu sprzętowego między dwa bity w rejestrze, a dodanie „bitów dziesiętnych” pomiędzy każdą parą bitów byłoby zbyt drogie. Co więc zrobić?
Kodujesz to. Zasadniczo architektura procesora lub oprogramowania określa, jak to się robi, ale jednym z powszechnych sposobów jest przechowywanie znaku (+ lub -, ogólnie 1 jest ujemny) w pierwszym bicie rejestru, mantysa (przesunięty numer jednak wiele razy trzeba pozbyć się przecinka dziesiętnego) dla następnej liczby bitów X i wykładnika (liczba razy, kiedy trzeba go przesunąć) dla pozostałej części. Jest podobny do notacji naukowej.
Wpisanie pozwala kompilatorowi wiedzieć, na co patrzy. Wyobraź sobie, że zapisałeś wartość 1,3 w rejestrze 1. Po prostu wymyślimy tutaj nasz własny fantazyjny schemat kodowania, 1 bit na znak, 4 dla mantysy, 3 dla wykładnika (1 bit na znak, 2 dla wielkości). Jest to liczba dodatnia, więc znak jest dodatni (0). Nasza mantysa wyniesie 13 (1101), a nasz wykładnik wyniesie -1 (101 (1 dla ujemnego, 01 = 1)). Więc przechowujemy 01101101 w rejestrze 1. Teraz nie wpisaliśmy tej zmiennej, więc kiedy środowisko wykonawcze przejdzie do jej użycia, mówi „jasne, to jest liczba całkowita, dlaczego nie”, więc kiedy wypisuje wartość, widzimy 109 (64 + 32 + 8 + 4 + 1), co oczywiście nie jest właściwe.
Jednak nie każdy język wymaga wyraźnego wpisania. C # ma słowo kluczowe „var”, które powoduje, że typ zmiennej jest interpretowany w czasie kompilacji, a inne języki, takie jak JavaScript, są całkowicie dynamicznie wpisywane, do tego stopnia, że można zapisać liczbę całkowitą w zmiennej, a następnie przypisać ją do wartości logicznej, a następnie przypisz go ponownie do łańcucha, a język będzie go śledził.
Ale kompilator, interpreter lub środowisko wykonawcze jest o wiele łatwiejsze - i często skutkuje szybszym programem, ponieważ nie musi on tracić cennych zasobów na sortowanie wszystkiego - na pytanie programisty, jaki rodzaj dane, które podajesz.