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); // 127Taş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); // InfinityBü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); // 1000000000000Bit 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 çarpman >> k— işaretli sağa kaydırma: 2^k ile bölmen >>> 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); // trueBit 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 execSayı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); // 4111111111111111Keyfi 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)); // 1000000000000000000000000000000Uygulama: 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()); // 2Hı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
- Math Sınıfının Temelleri
- Tamsayı Aritmetiği ve Taşma
- Finansal Hesaplamalar için BigDecimal
- NumberFormat ve printf