Giriş

Tətbiqlərin hazırlanması bəzi verilənlərlə işləmək, daha doğrusu, onların saxlanması və işlənməsi kimi qəbul edilə bilər. Bu gün mən birinci əsas aspektə toxunmaq istərdim. Java-da verilənlər necə saxlanılır? Burada iki mümkün formatımız var: istinadprimitiv məlumat növləri. Primitiv tiplərin növləri və onlarla işləmək imkanları haqqında danışaq (nə desək, bu, proqramlaşdırma dili haqqında biliklərimizin əsasıdır). Java primitiv məlumat növləri hər şeyin üzərində dayandığı təməldir. Xeyr, heç də şişirtmirəm. Oracle-ın primitivlərə həsr olunmuş ayrıca Təlimatı var: Primitiv Məlumat Tipləri Java-da primitiv tiplər: Onlar o qədər də primitiv deyil - 1 Bir az tarix. Başlanğıcda sıfır var idi. Amma sıfır darıxdırıcıdır. Və sonra bit göründü . Onu niyə belə adlandırdılar? O, “ bi nary digiti t ” (ikilik rəqəm) abbreviaturasından belə adlandırılmışdır . Yəni bunun yalnız iki mənası var. Və sıfır olduğu üçün indi ya 0, ya da 1 olması məntiqlidir. Və həyat daha əyləncəli olub. Bitlər sürü halında toplaşmağa başladı. Və bu sürülər bayt (bayt) adlandırılmağa başladı . Müasir dünyada bayt = 2 üçüncü gücə, yəni. 8. Amma belə çıxır ki, həmişə belə olmayıb. Bayt adının haradan gəldiyi haqqında çoxlu təxminlər, əfsanələr və şayiələr var. Bəzi insanlar hər şeyin o dövrün kodlaşdırması ilə bağlı olduğunu düşünür, bəziləri isə məlumatı bu şəkildə oxumağın daha sərfəli olduğunu düşünür. Bayt ünvanlanan ən kiçik yaddaş parçasıdır. Yaddaşda unikal ünvanları olan baytlardır. ByTe-nin Binary Term - maşın sözünün abbreviaturası olduğuna dair bir əfsanə var. Maşın sözü - sadəcə olaraq, bu, prosessorun bir əməliyyatda emal edə biləcəyi məlumatların miqdarıdır. Əvvəllər maşın sözünün ölçüsü ən kiçik ünvanlı yaddaşla eyni idi. Java-da dəyişənlər yalnız bayt dəyərlərini saxlaya bilər. Yuxarıda dediyim kimi, Java-da iki növ dəyişən var:
  • java primitiv tipləri məlumat baytlarının dəyərini birbaşa saxlayır (aşağıda bu primitivlərin növlərinə daha ətraflı baxacağıq);
  • istinad növü, obyektin ünvanının baytlarını Heap-də saxlayır, yəni bu dəyişənlər vasitəsilə biz birbaşa obyektin özünə daxil oluruq (obyekt üçün uzaqdan idarəetmə növü)

Java baytı

Beləliklə, tarix bizə bir bayt verdi - istifadə edə biləcəyimiz minimum yaddaş miqdarı. Və 8 bitdən ibarətdir. Java-da ən kiçik tam məlumat növü baytdır. Bu imzalanmış 8 bitlik bir növdür. Bunun mənası nədi? sayaq. 2^8 256-dır. Bəs mənfi ədəd istəsək necə olar? Və Java tərtibatçıları qərara gəldilər ki, "10000000" ikili kodu -128-i təmsil edəcək, yəni ən əhəmiyyətli bit (ən soldakı bit) rəqəmin mənfi olub olmadığını göstərəcək. Binar “0111 1111” 127-ə bərabərdir. Yəni 128 heç bir şəkildə təyin edilə bilməz, çünki -128 olacaq. Tam hesablama bu cavabda verilmişdir: Niyə Java-da bayt diapazonu -128 ilə 127 arasındadır? Nömrələrin necə əldə edildiyini başa düşmək üçün şəklə baxmalısınız:
Java-da primitiv tiplər: Onlar o qədər də primitiv deyillər - 2
Müvafiq olaraq, ölçüsünü hesablamaq üçün 2^(8-1) = 128. Bu o deməkdir ki, minimum hədd (və onun mənfi cəhəti var) -128 olacaq. Və maksimum 128 - 1 (sıfır çıxarın). Yəni maksimum 127 olacaq. Əslində biz bayt növü ilə o qədər də tez-tez “yüksək səviyyədə” işləmirik. Əsasən bu, “xam” məlumatların emalıdır. Məsələn, şəbəkə üzərindən məlumatların ötürülməsi ilə işləyərkən, verilənlər hansısa rabitə kanalı vasitəsilə ötürülən 0 və 1-lər dəsti olduqda. Və ya fayllardan məlumatları oxuyarkən. Onlar sətirlər və kodlaşdırmalarla işləyərkən də istifadə edilə bilər. Nümunə kodu:
public static void main(String []args){
        byte value = 2;
        byte shortByteValue = 0b10; // 2
        System.out.println(shortByteValue);
        // Начиная с JDK7 мы можем разделять литералы подчёркиваниями
        byte minByteValue = (byte) 0B1000_0000; // -128
        byte maxByteValue = (byte) 0b0111_1111; // 127
        byte minusByteValue = (byte) 0b1111_1111; // -128 + 127
        System.out.println(minusByteValue);
        System.out.println(minByteValue + " to " + maxByteValue);
}
Yeri gəlmişkən, bayt növünün istifadəsinin yaddaş istehlakını azaldacağını düşünməyin. Bayt əsasən məlumatların massivlərdə saxlanması zamanı yaddaş istehlakını azaltmaq üçün istifadə olunur (məsələn, bayt massivi kimi həyata keçiriləcək bəzi buferdə şəbəkə üzərindən alınan məlumatların saxlanması). Lakin verilənlər üzərində əməliyyatlar həyata keçirərkən baytdan istifadə gözləntilərinizə cavab verməyəcək. Bu, Java Virtual Maşının (JVM) tətbiqi ilə bağlıdır. Əksər sistemlər 32 və ya 64 bit olduğundan hesablamalar zamanı bayt və qısa 32 bitlik int-ə çevriləcək ki, bu barədə daha sonra danışacağıq. Bu hesablamaları asanlaşdırır. Ətraflı məlumat üçün bax: Bayt əlavəsi java dili qaydalarına görə int-ə çevrilir, yoxsa jvm? . Cavab həmçinin JLS (Java Language Specification) keçidlərini ehtiva edir. Bundan əlavə, baytın yanlış yerdə istifadəsi yöndəmsiz anlara səbəb ola bilər:
public static void main(String []args){
        for (byte i = 1; i <= 200; i++) {
            System.out.println(i);
        }
}
Burada bir döngə olacaq. Sayğac dəyəri maksimuma (127) çatdığı üçün daşqın baş verəcək və dəyər -128 olacaq. Və biz heç vaxt dövrandan çıxmayacağıq.

qısa

Bayt dəyərləri üçün məhdudiyyət olduqca kiçikdir. Buna görə də, növbəti məlumat növü üçün bitlərin sayını ikiqat artırmağa qərar verdik. Yəni indi 8 bit yox, 16. Yəni 2 baytdır. Dəyərlər eyni şəkildə hesablana bilər. 2^(16-1) = 2^15 = 32768. Bu o deməkdir ki, diapazon -32768 ilə 32767 arasındadır. Hər hansı xüsusi hallar üçün çox nadir hallarda istifadə olunur. Java dili sənədlərinin bizə dediyi kimi: “ böyük massivlərdə yaddaş saxlamaq üçün qısadan istifadə edə bilərsiniz .”

int

Beləliklə, ən çox istifadə olunan növə gəldik. 32 bit və ya 4 bayt tutur. Ümumiyyətlə, biz ikiqat artımda davam edirik. Dəyərlər diapazonu -2^31 ilə 2^31-1 arasındadır.

Maksimum int dəyəri

int 2147483648-in maksimum dəyəri 1-dir, bu heç də kiçik deyil. Yuxarıda qeyd edildiyi kimi, hesablamaları optimallaşdırmaq üçün, çünki Müasir kompüterlər üçün bit tutumunu nəzərə alaraq saymaq daha rahatdır; verilənlər dolayısı ilə int-ə çevrilə bilər. Budur sadə bir nümunə:
byte a = 1;
byte b = 2;
byte result = a + b;
Belə zərərsiz kod, lakin biz xəta alırıq: "xəta: uyğun olmayan növlər: int-dən bayta mümkün itkili çevrilmə." Siz onu bayt nəticəsinə düzəltməli olacaqsınız = (bayt)(a + b); Və daha bir zərərsiz nümunə. Aşağıdakı kodu işlətsək nə olar?
int value = 4;
System.out.println(8/value);
System.out.println(9/value);
System.out.println(10/value);
System.out.println(11/value);
Və nəticə çıxaracağıq
2
2
2
2
*çaxnaşma səsləri*
Məsələ burasındadır ki, int dəyərləri ilə işləyərkən, qalan hissə atılır, yalnız bütün hissə qalır (belə hallarda double istifadə etmək daha yaxşıdır).

uzun

İkiqat etməyə davam edirik. 32-ni 2-yə vururuq və 64 bit alırıq. Ənənəyə görə, bu 4 * 2, yəni 8 baytdır. Dəyərlər diapazonu -2^63 ilə 2^63 arasındadır – 1. Kifayət qədər çoxdur. Bu tip böyük, böyük rəqəmləri saymağa imkan verir. Zamanla işləyərkən tez-tez istifadə olunur. Və ya, məsələn, uzun məsafələrdə. Rəqəmin uzun olduğunu göstərmək üçün rəqəmdən sonra L – Uzun hərfi qoyun. Misal:
long longValue = 4;
longValue = 1l; // Не ошибка, но плохо читается
longValue = 2L; // Идеально
Mən özümü qabaqlamaq istərdim. Sonra, primitivlərlə obyekt kimi işləməyi mümkün edən ibtidailər üçün müvafiq sarğıların olduğunu nəzərdən keçirəcəyik. Ancaq maraqlı bir xüsusiyyət var. Budur bir nümunə: Eyni Tutorialspoint onlayn tərtibçisindən istifadə edərək, aşağıdakı kodu yoxlaya bilərsiniz:
public class HelloWorld {

     public static void main(String []args) {
        printLong(4);
     }

    public static void printLong(long longValue) {
        System.out.println(longValue);
    }
}
Bu kod səhvsiz işləyir, hər şey qaydasındadır. Lakin printLong metodunda tip longdan Longa dəyişdirilən kimi (yəni tip primitiv deyil, obyekt olur) Java-ya hansı parametri keçdiyimiz anlaşılmaz olur. Bir int ötürüldüyünü və səhv olacağını düşünməyə başlayır. Buna görə də, bir üsul vəziyyətində, 4L-ni açıq şəkildə göstərmək lazımdır. Çox vaxt uzun verilənlər bazası ilə işləyərkən ID kimi istifadə olunur.

Java float və Java double

Bu tiplərə üzən nöqtə tipləri deyilir. Yəni bunlar tam ədədlər deyil. Float növü 32 bitdir (int kimi), double isə ikiqat dəqiqlik növü adlanır, ona görə də 64 bitdir (elə bizim bəyəndiyimiz kimi 2-yə çarpın). Misal:
public static void main(String []args){
        // float floatValue = 2.3; lossy conversion from double to float
        float floatValue = 2.3F;
        floatValue = 2.3f;
        double doubleValue = 2.3;
        System.out.println(floatValue);
        double cinema = 7D;
}
Və burada dəyərlər fərqinə bir nümunə (növün dəqiqliyinə görə):
public static void main(String []args){
        float piValue = (float)Math.PI;
        double piValueExt = Math.PI;
        System.out.println("Float value: " + piValue );
        System.out.println("Double value: " + piValueExt );
 }
Bu primitiv növlər, məsələn, riyaziyyatda istifadə olunur. Budur sübut, PI sayını hesablamaq üçün sabitdir . Yaxşı, ümumiyyətlə, Riyaziyyat sinifinin API-sinə baxa bilərsiniz. Başqa nə vacib və maraqlı olmalıdır: hətta sənədlərdə belə deyilir: “ Bu məlumat növü heç vaxt valyuta kimi dəqiq dəyərlər üçün istifadə edilməməlidir. Bunun üçün əvəzinə java.math.BigDecimal sinifindən istifadə etməlisiniz.Numbers and Strings BigDecimal və Java platforması tərəfindən təmin edilən digər faydalı sinifləri əhatə edir. " Yəni float və double-da pulun hesablanmasına ehtiyac yoxdur. NASA-da iş nümunəsindən istifadə edərək dəqiqliyə dair bir nümunə: Java BigDecimal, Yüksək dəqiqlikli hesablamalarla məşğul olmaq Yaxşı, bunu özünüz hiss etmək üçün:
public static void main(String []args){
        float amount = 1.0000005F;
        float avalue = 0.0000004F;
        float result = amount - avalue;
        System.out.println(result);
}
Bu nümunəyə əməl edin, sonra 5 və 4 rəqəmlərindən əvvəl 0 əlavə edin. Və bütün dəhşəti görəcəksiniz) Rus dilində float və double haqqında maraqlı bir reportaj var: https://youtu.be/1RCn5ruN1fk İşləmə nümunələri BigDecimal ilə burada görünə bilərsiniz: BigDecimal ilə sent qazanın Yeri gəlmişkən, float və double yalnız bir ədəddən daha çoxunu qaytara bilər. Məsələn, aşağıdakı nümunə Sonsuzluğu qaytaracaq:
public static void main(String []args){
        double positive_infinity = 12.0 / 0;
        System.out.println(positive_infinity);
}
Və bu NAN-ı qaytaracaq:
public static void main(String []args){
        double positive_infinity = 12.0 / 0;
        double negative_infinity = -15.0 / 0;
        System.out.println(positive_infinity + negative_infinity);
}
Sonsuzluq haqqında aydındır. NaN nədir? Bu rəqəm deyil , yəni nəticə hesablana bilməz və rəqəm deyil. Budur bir nümunə: Biz -4-ün kvadrat kökünü hesablamaq istəyirik. 4-ün kvadrat kökü 2-dir.Yəni 2-nin kvadratı olmalıdır və sonra 4-ü alırıq. -4-ü almaq üçün nəyin kvadratını almaq lazımdır? Bu işləməyəcək, çünki... müsbət rəqəm varsa, o zaman qalacaq. Mənfi idisə, mənfi mənfi bir artı verəcəkdir. Yəni hesablamaq mümkün deyil.
public static void main(String []args){
        double sqrt = Math.sqrt(-4);
        System.out.println(sqrt + 1);
        if (Double.isNaN(sqrt)) {
           System.out.println("So sad");
        }
        System.out.println(Double.NaN == sqrt);
}
Budur, üzən nöqtə nömrələri mövzusunda başqa bir əla baxış: Fikriniz haradadır?
Başqa nə oxumaq lazımdır:

Java boolean

Növbəti növ Booleandır (məntiqi tip). Yalnız açar sözlər olan doğru və ya yanlış dəyərləri qəbul edə bilər. while döngələri kimi məntiqi əməliyyatlarda və if, keçiddən istifadə edərək budaqlanmada istifadə olunur. Burada hansı maraqlı şeyləri öyrənə bilərsiniz? Yaxşı, məsələn, nəzəri olaraq bizə yalnız 1 bit məlumat lazımdır, 0 və ya 1, yəni doğru və ya yanlış. Amma reallıqda Boolean daha çox yaddaş tutacaq və bu, konkret JVM tətbiqindən asılı olacaq. Adətən bu int ilə eyni qiymətə başa gəlir. Başqa bir seçim BitSet-dən istifadə etməkdir. Java Fundamentals kitabından qısa təsvir: BitSet

Java simvolu

İndi biz sonuncu primitiv tipə çatdıq. Beləliklə, chardakı məlumatlar 16 bit tutur və xarakteri təsvir edir. Java char üçün Unicode kodlaşdırmasından istifadə edir. Simvol iki cədvələ uyğun olaraq təyin edilə bilər ( burada baxa bilərsiniz ):
  • Unicode simvol cədvəli
  • ASCII simvol cədvəli
Java-da primitiv tiplər: Onlar o qədər də primitiv deyillər - 3
Studiyadakı nümunə:
public static void main(String[] args) {
    char symbol = '\u0066'; // Unicode
    symbol = 102; // ASCII
    System.out.println(symbol);
}
Yeri gəlmişkən, char mahiyyətcə ədəd olmaqla cəmi kimi riyazi əməliyyatları dəstəkləyir. Və bəzən bu gülməli nəticələrə səbəb ola bilər:
public class HelloWorld{

    public static void main(String []args){
        String costForPrint = "5$";
        System.out.println("Цена только для вас " +
        + costForPrint.charAt(0) + getCurrencyName(costForPrint.charAt(1)));
    }

    public static String getCurrencyName(char symbol) {
        if (symbol == '$') {
            return " долларов";
        } else {
            throw new UnsupportedOperationException("Not implemented yet");
        }
    }

}
Mən tutorialspoint-dən onlayn IDE-ni yoxlamağı çox tövsiyə edirəm . Konfransların birində bu tapmacanı görəndə ruhumu qaldırdı. Ümid edirəm nümunəni də bəyənirsiniz) YENİLƏNİB: Bu Joker 2017-də idi, hesabat: " Java Puzzlers NG S03 - Hamınız haradan gəlirsiniz?! "

Hərfi

Hərfi açıq şəkildə müəyyən edilmiş dəyərdir. Hərflərdən istifadə edərək, müxtəlif say sistemlərində dəyərləri təyin edə bilərsiniz:
  • Ondalık sistem: 10
  • Hexadecimal: 0x1F4, 0x ilə başlayır
  • Səkkizlik sistem: 010, sıfırdan başlayır.
  • Binar sistem (Java7-dən bəri): 0b101, 0b-dən başlayır
Səkkizlik sistem üzərində bir az daha dayanardım, çünki bu, gülməli idi:
int costInDollars = 08;
Bu kod xətti tərtib edilməyəcək:
error: integer number too large: 08
Cəfəngiyat kimi görünür. İndi ikili və səkkizlik sistemləri xatırlayaq. Binar sistemdə iki yoxdur, çünki iki dəyər var (0-dan başlayaraq). Səkkizlik sistemin isə sıfırdan başlayaraq 8 qiyməti var. Yəni 8 dəyərinin özü mövcud deyil. Ona görə də bu, ilk baxışda absurd görünən bir səhvdir. Və yadda saxlamaq lazımdır ki, dəyərlərin tərcüməsi üçün “izləmə” qaydası budur:
Примитивные типы в Java: Не такие уж они и примитивные - 4

Sarma sinifləri

Java-dakı primitivlərin öz sarğı sinifləri var ki, siz onlarla obyekt kimi işləyə biləsiniz. Yəni hər bir ibtidai tip üçün müvafiq istinad tipi var. Примитивные типы в Java: Не такие уж они и примитивные - 5Sarmalayıcı sinifləri dəyişməzdir: bu o deməkdir ki, obyekt yaradıldıqdan sonra onun vəziyyəti - dəyər sahəsinin dəyəri dəyişdirilə bilməz. Sarmalayıcı sinifləri yekun olaraq elan edilir: obyektlər, belə demək mümkünsə, yalnız oxunur. Onu da qeyd edim ki, bu siniflərdən vərəsəlik mümkün deyil. Java avtomatik olaraq primitiv növlər və onların sarğıları arasında dönüşümlər edir:
Integer x = 9;          // autoboxing
int n = new Integer(3); // unboxing
İbtidai tiplərin istinad tiplərinə (int->Integer) çevrilməsi prosesi autoboxing , əksi isə unboxing adlanır . Bu siniflər obyektin daxilində primitiv saxlamağa imkan verir və obyektin özü də Obyekt kimi davranacaq (yaxşı, hər hansı digər obyekt kimi). Bütün bunlarla biz çoxlu sayda müxtəlif, faydalı statik üsullar əldə edirik, məsələn, rəqəmləri müqayisə etmək, simvolu reqlamentə çevirmək, simvolun hərf və ya rəqəm olduğunu müəyyən etmək, minimum ədədi axtarmaq və s. Təqdim olunan funksionallıq dəsti yalnız qablaşdırmanın özündən asılıdır. int üçün sarğı tətbiqinin nümunəsi:
public class CustomerInt {

   private final int value;

   public CustomerInt(int value) {
       this.value = value;
   }

   public int getValue() {
       return value;
   }
}
Əsas paket olan java.lang, artıq Boolean, Byte, Short, Character, Integer, Float, Long, Double siniflərinin tətbiqinə malikdir və biz özümüzdən heç nə yaratmağa ehtiyac duymuruq, sadəcə olaraq hazır olanı yenidən istifadə edirik. olanlar. Məsələn, belə siniflər bizə, məsələn, Siyahı yaratmaq imkanı verir , çünki Siyahıda yalnız primitiv olmayan obyektlər olmalıdır. Primitiv tipli dəyəri çevirmək üçün statik valueOf metodları var, məsələn, Integer.valueOf(4) Integer tipli obyekti qaytaracaq. Ters çevrilmə üçün intValue(), longValue() və s. üsullar mövcuddur. Kompilyator öz-özünə valueOf və *Value çağırışlarını daxil edir, bu, autoboxing və autounboxing-in mahiyyətidir. Yuxarıda təqdim olunan avtomatik qablaşdırma və avtomatik qablaşdırma nümunəsi əslində necə görünür:
Integer x = Integer.valueOf(9);
int n = new Integer(3).intValue();
Avtomatik qablaşdırma və avtomatik qablaşdırma haqqında ətraflı məlumatı bu məqalədə oxuya bilərsiniz .

Cast

При работе с примитивами существует такое понятие How приведение типов, одно из не очень приятных свойств C++, тем не менее приведение типов сохранено и в языке Java. Иногда мы сталкиваемся с такими ситуациями, когда нам нужно совершать взаимодействия с данными разных типов. И очень хорошо, что в некоторых ситуациях это возможно. В случае с ссылочными переменными, там свои особенности, связанные с полиморфизмом и наследованием, но сегодня мы рассматриваем простые типы и соответственно приведение простых типов. Существует преобразование с расширением и преобразование сужающее. Всё на самом деле просто. Если тип данных становится больше (допустим, был int, а стал long), то тип становится шире (из 32 бит становится 64). И в этом случае мы не рискуем потерять данные, т.к. если влезло в int, то в long влезет тем более, поэтому данное приведение мы не замечаем, так How оно осуществляется автоматически. А вот в обратную сторону преобразование требует явного указания от нас, данное приведение типа называется — сужение. Так сказать, чтобы мы сами сказали: «Да, я даю себе отчёт в этом. В случае чего — виноват сам».
public static void main(String []args){
   int intValue = 128;
   byte value = (byte)intValue;
   System.out.println(value);
}
Whatбы потом в таком случае не говорor что «Ваша Джава плохая», когда получат внезапно -128 instead of 128 ) Мы ведь помним, что в byteе 127 верхнее meaning и всё что находилось выше него соответственно можно потерять. Когда мы явно превратor наш int в byte, то произошло переполнение и meaning стало -128.

Область видимости

Это то место в codeе, где данная переменная будет выполнять свои функции и хранить в себе Howое-то meaning. Когда же эта область закончится, переменная перестанет существовать и будет стерта из памяти и. How уже можно догадаться, посмотреть or получить ее meaning будет невозможно! Так что же это такое — область видимости? Примитивные типы в Java: Не такие уж они и примитивные - 6Область определяется "блоком" — вообще всякой областью, замкнутой в фигурные скобки, выход за которые сулит удаление данных объявленных в ней. Или How минимум — сокрытие их от других блоков, открытых вне текущего. В Java область видимости определяется двумя основными способами:
  • Классом.
  • Методом.
Как я и сказал, переменная не видна codeу, если она определена за пределами блока, в котором она была инициализирована. Смотрим пример:
int x;
x = 6;
if (x >= 4) {
   int y = 3;
}
x = y;// переменная y здесь не видна!
И How итог мы получим ошибку:

Error:(10, 21) java: cannot find symbol
  symbol:   variable y
  location: class com.javaRush.test.type.Main
Области видимости могут быть вложенными (если мы объявor переменную в первом, внешнем блоке, то во внутреннем она будет видна).

Заключение

Сегодня мы познакомorсь с восемью примитивными типами в Java. Эти типы можно разделить на четыре группы:
  • Целые числа: byte, short, int, long — представляют собой целые числа со знаком.
  • Числа с плавающей точкой — эта группа включает себе float и double — типы, которые хранят числа с точностью до определённого знака после запятой.
  • Булевы значения — boolean — хранят значения типа "истина/ложь".
  • Simvollar - bu qrupa simvol tipi daxildir.
Yuxarıdakı mətndən də göründüyü kimi, Java-da primitivlər o qədər də primitiv deyil və bir çox problemləri effektiv şəkildə həll etməyə imkan verir. Lakin bu, proqramımızda gözlənilməz davranışlarla qarşılaşmaq istəmiriksə, yadda saxlamalı olduğumuz bəzi xüsusiyyətləri də təqdim edir. Necə deyərlər, hər şeyi ödəməlisən. Əgər biz "dik" (geniş) diapazonlu primitiv istəsək - uzun kimi bir şey - daha böyük bir yaddaş parçasının və əks istiqamətdə ayrılmasını qurban veririk. Yaddaşa qənaət etməklə və baytlardan istifadə etməklə -128-dən 127-yə qədər məhdud diapazon əldə edirik.