0Pricing
Java Academy · Ders

Tamsayı Aritmetiği ve Taşma

Tamsayı bölmesini, kalanı, taşma davranışını ve taşmanın nasıl algılanacağını anlayın.

Tamsayı Aritmetiği ve Taşma, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.

Tamsayı Aritmetiği ve Taşma

Java tamsayılarının boyutları sabittir. Bir hesaplama izin verilen en büyük veya en küçük değeri aştığında sessizce devreder; hiçbir hata oluşturulmaz. Bunu anlamak, fark edilmesi zor hataları önler.

Tamsayı Aralıkları

Her tamsayı türünün aralığı, bit genişliğiyle belirlenen sınırlara sahiptir:

  • byte: -128 ile 127 arası
  • short: -32.768 ile 32.767 arası
  • int: -2.147.483.648 ile 2.147.483.647 arası
  • long: -9,2 × 10^18 ile 9,2 × 10^18 arası
System.out.println(Integer.MAX_VALUE); // 2147483647
System.out.println(Integer.MIN_VALUE); // -2147483648
System.out.println(Long.MAX_VALUE);    // 9223372036854775807
System.out.println(Byte.MAX_VALUE);    // 127

Taşma: Sessiz Döngüsel Devretme

Integer.MAX_VALUE değerine 1 eklemek, Integer.MIN_VALUE değerine döngüsel olarak devreder. Bu, ikinin tümleyeni aritmetiğidir; Java herhangi bir garanti vermez ve hata oluşturmaz.

int max = Integer.MAX_VALUE;
System.out.println(max + 1); // -2147483648 (overflow!)

byte b = 127;
b++;  // wraps to -128
System.out.println(b); // -128

// Real bug: counting votes in a large election with int
int votes = Integer.MAX_VALUE;
votes += 100; // silently wrong
System.out.println(votes); // negative number!

Math.addExact ile Taşmayı Belirleme

Java 8+, sessizce devretmek yerine taşma durumunda ArithmeticException oluşturan Math.addExact(), multiplyExact() ve subtractExact() yöntemlerini kullanıma sundu.

try {
    int result = Math.addExact(Integer.MAX_VALUE, 1);
} catch (ArithmeticException e) {
    System.out.println("Overflow detected!"); // prints this
}

try {
    long safe = Math.multiplyExact(100_000L, 100_000L);
    System.out.println(safe); // 10000000000
} catch (ArithmeticException e) {
    System.out.println("Multiply overflow");
}

Tamsayı Bölmesi ve Modül İşlemi

Tamsayı bölmesi sıfıra doğru kesilir. % operatörü, bölümün işaretini taşıyan kalanı verir. Sıfıra bölmeye dikkat edin; bu işlem ArithmeticException oluşturur.

System.out.println(10 / 3);    // 3 (not 3.33)
System.out.println(10 % 3);    // 1
System.out.println(-10 % 3);   // -1 (sign follows dividend)
System.out.println(-10 % -3);  // -1

try {
    int x = 5 / 0; // ArithmeticException: / by zero
} catch (ArithmeticException e) {
    System.out.println(e.getMessage()); // / by zero
}

// Float division by zero gives Infinity, not exception
System.out.println(5.0 / 0); // Infinity

Büyük Sayılar için Long Aritmetiği

Değerler int aralığını aşabilecekse long kullanın. Atamadan önce taşmayı önlemek için long değişmezlerine her zaman L ekleyin.

// Bug: multiplication done as int, then widened
long wrong = 1_000_000 * 1_000_000;   // overflows int!
System.out.println(wrong); // -727379968 (wrong!)

// Fix: one operand is long
long correct = 1_000_000L * 1_000_000L;
System.out.println(correct); // 1000000000000

// Or cast first
long alsOk = (long) 1_000_000 * 1_000_000;
System.out.println(alsOk); // 1000000000000

Bit Kaydırma Operatörleri

Bit kaydırma operatörleri, 2'nin kuvvetleriyle çarpma veya bölme yapmanın hızlı yollarıdır:

  • n << k — sola kaydırma: 2^k ile çarpma
  • n >> k — işaretli sağa kaydırma: 2^k ile bölme
  • n >>> k — işaretsiz sağa kaydırma: 0'larla doldurur
int n = 8;
System.out.println(n << 1);  // 16 (8 * 2)
System.out.println(n << 2);  // 32 (8 * 4)
System.out.println(n >> 1);  // 4  (8 / 2)
System.out.println(n >> 2);  // 2  (8 / 4)

// Check if number is power of 2
boolean isPow2 = n > 0 && (n & (n - 1)) == 0;
System.out.println(isPow2); // true

Bit Düzeyinde AND, OR, XOR

Bit düzeyindeki operatörler tek tek bitler üzerinde çalışır ve izinlerde, bayraklarda ve düşük seviyeli iletişim kurallarında kullanılır.

int a = 0b1010; // 10
int b = 0b1100; // 12

System.out.println(Integer.toBinaryString(a & b)); // 1000 (AND = 8)
System.out.println(Integer.toBinaryString(a | b)); // 1110 (OR  = 14)
System.out.println(Integer.toBinaryString(a ^ b)); // 0110 (XOR = 6)
System.out.println(Integer.toBinaryString(~a));    // ...11110101 (NOT)

// Permission flags example
int READ  = 0b001;
int WRITE = 0b010;
int EXEC  = 0b100;
int perms = READ | WRITE; // user has read+write
System.out.println((perms & EXEC) != 0); // false — no exec

Sayısal Değişmezlerde Alt Çizgiler

Java 7+, okunabilirliği artırmak için sayısal değişmezlerde alt çizgi kullanımına izin verir. Derleyici bunları yok sayar.

int million = 1_000_000;
long creditCard = 4_111_1111_1111_1111L;
double pi = 3.141_592_653_589_793;
int hex = 0xFF_EC_D1_2E;
int binary = 0b0001_0101_0110;

System.out.println(million);   // 1000000
System.out.println(creditCard); // 4111111111111111

Keyfi Hassasiyet için BigInteger

Değerler long türünü aştığında BigInteger kullanın. Taşma yaşanmaz, ancak ilkel türlerden daha yavaştır. Şifreleme anahtarları, faktöriyeller ve astronomik büyüklükteki sayılar için kullanın.

import java.math.BigInteger;

BigInteger factorial100 = BigInteger.ONE;
for (int i = 2; i <= 100; i++) {
    factorial100 = factorial100.multiply(BigInteger.valueOf(i));
}
System.out.println(factorial100.toString().length() + " digits"); // 158 digits

BigInteger a = new BigInteger("999999999999999999999999999999");
BigInteger b = new BigInteger("1");
System.out.println(a.add(b)); // 1000000000000000000000000000000

Uygulama: Taşmaya Güvenli Sayaç

Math.addExact kullanarak ve taşma durumunda Long.MAX_VALUE değerine geri dönerek taşmayı güvenli şekilde ele alan bir sayaç uygulama örüntüsü.

class SafeCounter {
    private long count = 0;

    public void increment() {
        try {
            count = Math.addExact(count, 1L);
        } catch (ArithmeticException e) {
            count = Long.MAX_VALUE; // cap at max
        }
    }

    public long get() { return count; }
}

SafeCounter sc = new SafeCounter();
sc.increment();
sc.increment();
System.out.println(sc.get()); // 2

Hızlı Kontrol

Aşağıdaki ifadenin değeri nedir?

long result = 1_000_000 * 1_000_000;
System.out.println(result);

Özet: Tamsayı Aritmetiği ve Taşma

Önemli çıkarımlar:

  • Tamsayı taşması sessizce sınırdan taşarak başa döner; varsayılan olarak istisna oluşturmaz
  • Taşmayı yakalamak için Math.addExact/multiplyExact/subtractExact kullanınız
  • Tamsayı bölmesi sıfıra doğru keser; % işaretini bölünen değerden alır
  • Ara sonuçlar int sınırını aşabilecekse long sabitlerini (L son ekiyle) kullanınız
  • BigInteger, taşma olmadan istenildiği kadar büyük değerleri işler
  • Bit kaydırma operatörleri, 2'nin kuvvetleriyle çarpma ve bölmeye hızlı alternatiflerdir

Sıkça Sorulan Sorular

“Tamsayı Aritmetiği ve Taşma” dersi ücretsiz mi?

Evet — “Tamsayı Aritmetiği ve Taşma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.

“Tamsayı Aritmetiği ve Taşma” dersinde ne öğreneceğim?

Tamsayı bölmesini, kalanı, taşma davranışını ve taşmanın nasıl algılanacağını anlayın. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Java Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“Tamsayı Aritmetiği ve Taşma” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Math Sınıfının Temelleri
  2. Tamsayı Aritmetiği ve Taşma
  3. Finansal Hesaplamalar için BigDecimal
  4. NumberFormat ve printf
← Java Academy Sayfasına Dön