0

Typy danych w programowaniu – czy to aby na pewno prozaiczna sprawa?

Typy danych w komputerze

Praktycznie na samym początku nauki programowania młodzi adepci są uczeni o typach danych występujących w danym języku programowania. W polskiej rzeczywistości są to zazwyczaj typy z języka C/C++, co w zasadzie jest całkiem mądrą decyzją… ale niestety później w innych językach programowania jest to zagadnienie, które omawia się w 10 sekund. Szkoda, bo jednak ta sprawa może mieć całkiem duże znaczenie w przyszłości programisty i pewnie prędzej czy później będzie musiał sam się tego dokładnie dowiedzieć.

Standardowe proste typy danych

Zakładam, że Czytelnik miał już styczność z typami danych, więc jakoś zbytnio nie będę się starał tłumaczyć po co one są i jak je wykorzystywać. Natomiast w większości języków programowania wysokiego poziomu możemy spotkać następujące typy (pisownia się różni między językami):

  • integer – liczby całkowite,
  • float – liczby zmiennoprzecinkowe pojedynczej precyzji,
  • double – liczby zmiennoprzecinkowe podwójnej precyzji,
  • char – pojedynczy bajt,
  • boolean – prawda/fałsz,
  • string – ciąg znaków.

W zasadzie co do tej listy to myślę, że nie powinno być specjalnych zastrzeżeń, może oprócz tego, że string w niektórych językach jest typem złożonym. Skoro jednak chcę omówić jak najwięcej języków programowania to trzeba iść na pewne uogólnienia, a wydaje mi się, że w nowszych językach często jest to typ prosty. Oczywiście odpowiednio połączone typy proste dają typy złożone i inne struktury danych.

Jaki jest problem?

O ile powyższy wykaz powinien być w miarę jasny, to problemem jest to, że prawie każdy język programowania trochę inaczej traktuje te typy, np. rezerwuje dla nich różną ilość pamięci. To właśnie moim zdaniem jest fragment wiedzy, o której zdarza się zapomnieć, a warto go również zgłębić. Taką myśl podsunął mi Ben Adams w swoim Tweecie, w którym porównuje dwie różne i odpowiednio duże liczby ze sobą… a język programowania stara się go przekonać, że są sobie równe:

Znane błędy

Nie sposób też nie wspomnieć o tym, że odpowiednio dobrane liczby zmiennoprzecinkowe mogą powodować praktycznie dowolnie duży błąd w obliczeniach, szczególnie przy dodawaniu i odejmowaniu, co wynika ze sposobu reprezentacji liczb w komputerze. Jest to typowa uwaga, o której pewnie każdy już słyszał 😉

Przy porównywaniu odpowiednio dużych liczb (nawet całkowitych) trzeba zwrócić dużą uwagę, czy aby na pewno ta liczba mieści się w oczekiwanym przez nas typie. W przypadku gdy tak nie jest to dostaniemy po prostu błędny wynik (zazwyczaj nie będziemy świadomi tego, że cokolwiek poszło niepoprawnie). Poniżej przedstawiam kilka ciekawych przykładów:

#include <iostream>

using namespace std;

int main()
{
   float a_float = 1000.f;
   float b_float = 0.003f;

   bool bool_val= 277;
   
   cout<<"a_float + b_float: "<<a_float+b_float<<"\n";
   cout<<"bool_val: "<<bool_val<<"\n";
  
   if ((unsigned int)4294967296 == (unsigned int)8589934592){
        cout<<"(unsigned int)4294967296 == (unsigned int)8589934592: "<<"TRUE";
   }
}


---
// Wyniki:
// a_float + b_float: 1000
// bool_val: 1
// (unsigned int)4294967296 == (unsigned int)8589934592: TRUE

Jak widać, jeśli nie znamy dobrze zasad rządzących typami danych w używanym przez nas języku programowania to może nas czasem spotkać niezbyt miła niespodzianka. Sprawa jest jeszcze ciekawsza w językach o słabym typowaniu!

Różne języki programowania

Tak jak wspomniałem typ danych, a co za tym idzie ograniczenia stawiane danym (szczególnie liczbom), są uzależnione od języka programowania, a często również od kompilatora i systemu operacyjnego. Żeby więc nie tworzyć artykułu długiego na 50 stron to postanowiłem, że opiszę najpopularniejsze języki programowania pod tym kątem w osobnych artykułach, przez co będę mógł też bardziej opisać rozwiązania tam stosowane. Myślę, że wiele osób może być zainteresowanych tym tematem. Zapraszam więc do kontynuacji czytania artykułów o typowaniu w artykułach poświęconych różnym językom.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *