1. Jakie są rodzaje liczb?
W programowaniu nieustannie pracujemy z liczbami — od wieku użytkownika po liczbę gwiazd w galaktyce czy groszy na koncie bankowym. Jednak różne zadania wymagają różnych rodzajów liczb: czasem ważne jest przechowywanie tylko liczb całkowitych, czasem — bardzo dokładnych ułamków, a czasem potrzebne są liczby „bez minusów”.
Liczby całkowite (int i inne)
Liczba całkowita to liczba bez części ułamkowej.
W Javie najczęściej używa się typu int, ale oprócz niego istnieje kilka wariantów różniących się rozmiarem i zakresem.
- int — podstawowy „roboczy” typ dla liczb całkowitych. Mieści bardzo duże (i małe) wartości, a pamięci zajmuje niezbyt dużo. Na przykład do zliczania polubień, wieku, liczby dni w roku prawie zawsze użyjesz int.
- long — używany, gdy wartości mogą być bardzo duże (np. miliardy lub biliony). Przykład: przechowywanie sumy wszystkich wyświetleń na YouTube w całej historii.
- short — oszczędny, lecz rzadko używany typ. Nadaje się tam, gdzie występuje wiele powtarzalnych małych wartości (np. dane audio, składowe kolorów).
- byte — dla jeszcze mniejszych wartości, zwłaszcza w grafice i pracy z plikami, gdzie liczy się oszczędność pamięci.
Liczby zmiennoprzecinkowe (double, float)
Czasem trzeba pracować z liczbami mającymi część ułamkową. Na przykład temperatura powietrza, średnia ocena studenta, cena towaru z groszami.
- double — typ „domyślny” do przechowywania liczb zmiennoprzecinkowych. Wystarczająco dokładny dla większości obliczeń (np. 3.1415926535…).
- float — lżejszy i mniej dokładny typ; częściej spotykany w zadaniach grafiki komputerowej lub przy przetwarzaniu dużych tablic danych, gdzie ważna jest oszczędność pamięci.
Specjalne typy liczbowe
- BigInteger — gdy trzeba pracować z ogromnymi liczbami, przekraczającymi standardowe zakresy, np. w kryptografii lub obliczeniach w astronomii.
- BigDecimal — klasa do precyzyjnych obliczeń na liczbach zmiennoprzecinkowych (finanse, kalkulacja procentów); pomaga uniknąć niedokładności typowych dla double i float.
2. Zakresy wartości
Typy całkowite mogą przechowywać zarówno liczby dodatnie, jak i ujemne. To wygodne, gdy wartości mogą być „i powyżej, i poniżej zera”: na przykład temperatura, saldo konta, wysokość względem poziomu morza.
Przykład:
- int : -10, 0, 50
- long : 0, 10, -1000_000_000_000_000_000L
Typy całkowite
| Typ | Rozmiar | Zakres wartości | Przykład użycia |
|---|---|---|---|
|
1 bajt | -128 do 127 | -128, 0, 127 |
|
2 bajty | -32 768 do 32 767 | -1000, 0, 32000 |
|
4 bajty | -2 147 483 648 do 2 147 483 647 | -1000000, 0, 2000000 |
|
8 bajtów | -9 223 372 036 854 775 808 do 9 223 372 036 854 775 807 |
-10_000_000_000, 1 |
Typy zmiennoprzecinkowe
| Typ | Rozmiar | Przykłady wartości | Opis |
|---|---|---|---|
|
4 bajty | 3.14f, -0.001f | pojedyncza precyzja (7 cyfr) |
|
8 bajtów | 3.1415, -1.7E+308 | podwójna precyzja (15–16 cyfr) |
3. Sufiksy liczbowe
W niektórych sytuacjach trzeba jawnie wskazać, jakiego typu chcesz użyć dla liczby. Robi się to za pomocą sufiksów:
- L lub l — dla typu long (np. 10000000000L)
- F lub f — dla typu float (np. 3.14f)
- D lub d — dla typu double (zwykle zbędny, ponieważ liczby zmiennoprzecinkowe bez sufiksu to double)
Jeśli nie podasz sufiksu, to domyślnie liczba całkowita jest traktowana jako int, a zmiennoprzecinkowa — jako double. Na przykład, 42 to int, a 3.14 to double.
Po co to jest potrzebne? Na przykład, aby nie dostać błędu przy przypisaniu dużej liczby do zmiennej typu long:
long bigNumber = 9000000000L; // jeśli usuniesz L, będzie błąd kompilacji
Separator w postaci podkreślenia _
Gdy liczby są długie, łatwo się pogubić w zerach. Dla urody i wygody czytania w Javie można używać podkreśleń wewnątrz liczby.
int population = 146_700_000;
long stars = 100_000_000_000L;
To w pełni legalne: kompilator ignoruje podkreślenia, a Tobie wygodnie od razu „na oko” widzieć rzędy. Najważniejsze — nie stawiać podkreślenia na początku, na końcu, po kropce ani przed sufiksem.
4. Typ znakowy char: co to jest i po co?
Typ char służy do przechowywania jednego znaku: litery, cyfry, znaku interpunkcyjnego, spacji, znaku specjalnego, a nawet buźki.
Przykłady:
char letter = 'A';
char digit = '7';
char symbol = '?';
char cyrillic = '\u0416';
char euro = '€';
char smile = '☺'; // Tak, to też jest możliwe!
Ważne zasady:
- Wartość typu char zapisuje się w pojedynczych cudzysłowach: 'A', '7', '#'.
- To dokładnie jeden znak! Jeśli napiszesz 'AB' — kompilator zaprotestuje.
- Za każdym znakiem kryje się jego kod liczbowy (Unicode).
Unicode: znaki z całego świata
Java używa standardu Unicode, co pozwala przechowywać nie tylko litery łacińskie, ale też cyrylicę, ideogramy, emoji, a nawet staroegipskie hieroglify (gdyby zaszła taka potrzeba).
Ciekawostka:
Typ char to w istocie 16-bitowa liczba (od 0 do 65535), gdzie każdej wartości odpowiada jakiś znak.
5. Znaki i liczby: powiązanie przez Unicode
Ponieważ każdy znak wewnątrz to liczba, możemy swobodnie przekształcać char do int i z powrotem.
Przykład: odczytać kod Unicode znaku
public class CharToInt {
public static void main(String[] args) {
char ch = 'A';
int code = ch; // Niejawne przekształcenie char → int
System.out.println("Kod znaku '" + ch + "': " + code);
}
}
Wynik:
Kod znaku 'A': 65
A teraz odwrotnie — uzyskać znak na podstawie kodu:
public class IntToChar {
public static void main(String[] args) {
int code = 1040; // Kod litery '\u0410' w Unicode (cyrylica)
char ch = (char) code; // Jawne przekształcenie int → char
System.out.println("Znak o kodzie " + code + ": " + ch);
}
}
Wynik:
Znak o kodzie 1040: \u0410
6. Podstawowe typy prymitywne Javy
| Typ | Rozmiar (bity) | Zakres wartości | Przykład wartości | Uwaga |
|---|---|---|---|---|
|
8 | -128 ... 127 | 42 | Używany bardzo rzadko |
|
16 | -32,768 ... 32,767 | 12345 | Dla oszczędności pamięci |
|
32 | -2,147,483,648 ... 2,147,483,647 | 1000000 | Podstawowy dla liczb całkowitych |
|
64 | ≈ −9.22 × 1018 ... ≈ 9.22 × 1018 | 5000000000L | Do bardzo dużych liczb całkowitych |
|
32 | ~±3.4 × 10-38 ... ±3.4 × 1038 | 3.14f | Liczby zmiennoprzecinkowe, niska precyzja |
|
64 | ~±1.7 × 10-308 ... ±1.7 × 10308 | 2.718 | Liczby zmiennoprzecinkowe, wysoka precyzja |
|
16 | 0 ... 65 535 (Unicode) | '\u0416', 'A', '?' | Jeden znak |
|
1 | true, false | true | Wartość logiczna |
GO TO FULL VERSION