Articles

Maximum Value of an Integer: Java Vs C vs Python

Wprowadzenie

W Data Science, kiedy mówimy o liczbach całkowitych, odnosimy się do typu danych, który reprezentuje pewien zakres matematycznych liczb całkowitych. Wiemy, że matematyczne liczby całkowite nie mają górnej granicy, ale może to być problem w zakresie rozmiaru pamięci, zmuszając prawie każdą architekturę komputerową do ograniczenia tego typu danych.

Więc, to jest pytanie, które próbujemy zadać dzisiaj: „Jaka jest maksymalna wartość całkowita, którą możemy reprezentować na pewnej maszynie?”

Wyjaśnienie problemu

Cóż, nie ma unikalnej odpowiedzi na to pytanie, ponieważ istnieje wiele czynników, które wpływają na odpowiedź. Główne z nich to:

  • Bity platformy
  • Używany język
  • Podpisane lub niepodpisane wersje

W informatyce, najbardziej powszechną reprezentacją liczb całkowitych jest grupa cyfr binarnych (bitów), przechowywanych jako binarny system liczbowy. Kolejność bajtów pamięci jest różna – mając n bitów, możemy zakodować 2^n liczb całkowitych.

Możemy zobaczyć różnice w tym prostym przykładzie: z n bitów, możemy zakodować liczby całkowite od 0 do 2^n - 1 lub od - 2^{n-1} do 2^{n-1} - 1.

Zwykle rozmiar liczby całkowitej n jest określony przez architekturę maszyny, ale niektóre języki komputerowe również definiują rozmiary liczb całkowitych niezależnie. Różne procesory obsługują różne typy danych, w oparciu o ich własną platformę. Zazwyczaj wszystkie obsługują zarówno typy podpisane, jak i niepodpisane, ale tylko o ograniczonym i stałym zestawie szerokości, zwykle 8, 16, 32 i 64 bity.

Niektóre języki definiują dwa lub więcej rodzajów typów danych całkowitych, jeden mniejszy, aby zachować pamięć i zająć mniej miejsca, a drugi większy, aby poprawić obsługiwany zakres.

Inną rzeczą, o której należy pamiętać, jest rozmiar słowa (zwany również długością słowa) platformy.

W informatyce, słowo jest jednostką danych używaną przez konkretny projekt procesora, kawałek danych o stałej wielkości obsługiwany jako jednostka przez sprzęt procesora. Kiedy mówimy o rozmiarze słowa, odnosimy się do liczby bitów w słowie i jest to kluczowa cecha każdej konkretnej architektury komputerowej i projektu procesora.

Obecne architektury mają zwykle 64-bitowy rozmiar słowa, ale są też takie, które mają 32 bity.

Czas na odpowiedzi

W tym rozdziale odpowiemy na nasze pytania, zaczynając od starego przyjaciela C do stosunkowo nowego Pythona, przechodząc przez wiecznie zieloną Javę. Zaczynajmy.

3.1. C

Język C został zaprojektowany w 1972 roku, z myślą o tym, aby działał tak samo na różnych typach maszyn. Dlatego nie określa on bezpośrednio zakresu dla typu danych całkowitych, ponieważ zależy to od architektury maszyny.

Jednakże C posiada dwa rodzaje liczb całkowitych; krótkie i długie.

Krótka liczba całkowita ma co najmniej 16 bitów. Tak więc, na maszynie 16-bitowej, pokrywa się z formatem długiej liczby całkowitej. Krótki format liczb całkowitych ma zakres od -32,767 do 32,767 dla wersji podpisanej i od 0 do 65,535 dla niepodpisanej. Cóż, to dziwne, ale wygląda na to, że dla wersji podpisanej brakuje nam liczby. Jest to łatwe do wytłumaczenia: ponieważ potrzebujemy jednego bitu do znaku!

Jeśli działamy w systemie 64-bitowym, możemy łatwo obliczyć, że długi format może osiągnąć 2^{64-1} wartość, która odpowiada 18,446,744,073,709,551,615 dla niepodpisanego typu danych i mieści się w zakresie od -9,223,372,036,854,775,807 do 9,223,372,036,854,775,807 w wersji podpisanej.

Dla kompletności, zrobimy sobie małą przejażdżkę po typie danych long long integer. Format long long nie jest dostępny w C, a jedynie w wersji C99. Ma dwukrotnie większą pojemność pamięci niż długi typ danych, ale oczywiście nie jest obsługiwany przez kompilatory, które wymagają poprzedniego standardu C. Dzięki długiemu typowi danych long możemy osiągnąć ogromną 2^{64-1} jeśli uruchamiamy go na maszynie 32-bitowej lub wyższej.

3.2. Java

Mówiąc o Javie, musimy pamiętać, że działa ona poprzez maszynę wirtualną. To oszczędza nam całej zmienności wyjaśnionej dla języka C.

Java obsługuje tylko podpisane wersje liczb całkowitych. Są to:

  • bajt (8 bitów)
  • short (16 bitów)
  • int (32 bity)
  • long (64 bity)

Więc, z formatem długiej liczby całkowitej możemy osiągnąć 2^{64-1} jak w przypadku C na maszynie 64-bitowej, ale tym razem na każdej architekturze maszyny.

Jednakże, z pewną manipulacją bitową, możemy uzyskać niepodpisane wersje, dzięki formatowi char. Jest to format 16-bitowy, więc format liczb całkowitych bez znaku może osiągnąć 65,535.

Ale w Javie, możemy pójść dalej z małym hackiem, dzięki czemu możemy reprezentować bardzo duże liczby całkowite poprzez bibliotekę klasy BigInteger. Biblioteka ta łączy tablice mniejszych zmiennych, aby zbudować ogromne liczby. Jedynym ograniczeniem jest pamięć fizyczna, więc możemy reprezentować ogromny, ale wciąż ograniczony, zakres liczb całkowitych.

Na przykład, z 1 kilobajtem pamięci, możemy osiągnąć liczby całkowite o długości do 2,466 cyfr!

3.3. Python

Python bezpośrednio obsługuje liczby całkowite o arbitralnej precyzji, zwane również liczbami całkowitymi o nieskończonej precyzji lub bignumami, jako konstrukcję najwyższego poziomu.

To oznacza, że podobnie jak w przypadku Java BigInteger, używamy tyle pamięci, ile potrzeba na arbitralnie dużą liczbę całkowitą. Tak więc, jeśli chodzi o język programowania, to pytanie w ogóle nie dotyczy Pythona, ponieważ zwykły typ całkowity jest, teoretycznie, nieograniczony.

To, co nie jest nieograniczone, to rozmiar słowa bieżącego interpretera, który jest taki sam jak rozmiar słowa maszyny w większości przypadków. Ta informacja jest dostępna w Pythonie jako sys.maxsize, i jest to rozmiar największej możliwej listy lub sekwencji w pamięci, która odpowiada maksymalnej wartości reprezentowanej przez podpisane słowo.

Na 64-bitowej maszynie odpowiada 2^{64-1} = 9,223,372,036,854,775,807.

Flowchart

Spójrzmy na flowchart, aby podsumować to, co widzieliśmy do tej pory:

Realny kod dla każdego języka

A oto trochę prawdziwego kodu, aby bezpośrednio sprawdzić to, co omówiliśmy do tej pory. Kod zademonstruje maksymalne i minimalne wartości liczb całkowitych w każdym z języków.

Ponieważ te wartości nie istnieją w Pythonie, kod pokazuje, jak wyświetlić rozmiar słowa bieżącego interpretera.

5.1. Kod C

#include<bits/stdc++.h>int main() { printf("%d\n", INT_MAX); printf("%d", INT_MIN); return 0; }

5.2. Kod Java

public class Test { public static void main(String args) { System.out.println(Integer.MIN_VALUE); System.out.println(Integer.MAX_VALUE); }}

5.3. Kod Pythona

import platformplatform.architecture()import syssys.maxsize

Wniosek

W tym artykule pokryliśmy różnice między tymi trzema najlepszymi językami na temat maksymalnej możliwej liczby całkowitej. Pokazaliśmy również, jak to pytanie nie ma zastosowania w niektórych sytuacjach.

Jednakże zawsze należy używać najlepiej pasujących w danej sytuacji, aby zapobiec zużyciu pamięci i opóźnieniom systemu.

Dodaj komentarz

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