Bilgisayarlar için 1 Ocak 1970 özel bir tarih. Bilgisayarların ilk keşfedildiği zamanlarda bir mekanizmaya ihtiyaç vardı bilgisayarın saati hesaplayabilmesi için.
Fakat bunu yapmak okadar da kolay değildi çünkü zamanı zorlaştıran insanlar tarafından çıkarılan terimler vardı saatler, günler, aylar gibi. Tek gereken şey hiç durmayan bir saatti.
Bunu yapmanın en kolay yolu ise bir tam sayı. 1 Ocak 1970 tarihi 0 olarak seçildi ve o zamandan itibaren geçen zamanı bilgisayarlar her bir saniye olarak hesapladı. Mesela şuan bu yazıyı yazarken telefonumda, bilgisayarımda aynı sistemi kullanıyor. İkisinde de saat bizim şuan gördüğümüz gibi değil fakat saniyelerle ifade ediliyor.
Örnek olarak şu tarihi 18 Ocak 2017 vede saati 12:24 olarak görüyorum fakat bilgisayarım bunu 1484702748 saniye olarak görüyor.
Burada bilmeniz gereken şey, 1 Ocak 1970in gecesi saat 12 bu sistemde 0 olarak alınıyor.
Asıl sorunumuza geri dönersek. Bu sorun sadece 64-bit işletim sistemine sahip iPhonelarda oluyor.
64-Bit nedir?
64-Bit 64 tane binary rakamın olduğu anlamına geliyor. Şuana kadar 32-Bit sistem kullanılıyordu vede onlarda böyle bir sorun yoktu çünkü üstüne yıllarca çalışılmış bir sistemdi. 32 den 64 e geçmenin bir sürü prosedürü var. Bazı kodların değiştirilmesi gerekiyor ve sanırım işte tam olarak burada bir detayı kaçırdılar.
Bit Sistemi Nasıl Çalışır?
Şimdi burada 64-Bit göstermek pek mantıklı olmaz. Bu yüzden 4-Bit yapalım. Örnek olarak ;
0000 = 0
0001 = 1
0010 = 2
0011 = 3
1010 = 10
1111 = 15
15, 4-Bit ile depolayabileceğiniz en yüksek sayıdır. Daha yükseğe çıkamazsınız. Fakat denerseniz ne olur? İşte o zamam Tam Sayı Taşması (Integer Overflow) olur. 1111 den sonra 0000 olur ve başa döner. 4-Bit sistem kullanıldığı zaman gördüğünüz gibi bu sorun oluyor fakat 64-Bit sistemde 15 quin trillion sayısını geçtikten sonra sorun yaşarsınız. Evet, gerçek bir sayı. Bu yüzden şimdilik bir sorunumuz yok 😀
Biraz Daha Detaya İnelim İsterseniz
Yine 4-Bitten örnek verelim. Eğer 1111 +1 sıfır olarak geliyorsa, 0000 -1 bize ne sonuç verir? İşte buna Integer Underflow deniliyor. Bu sistemde negatif sayı bulunma ihtimalinin olmadığına göre başa saracak ve mümkün olan en yüksek rakamı verecektir. Bu sistemde negatif sayıların kullanıldığı durumlar far, eğer Apple bunu kullanıyor olsa bu sorunu yaşamazdı fakat neden kullansın ki? Sonuçta negatif bir zaman kavramı yoktur. Sonuçta neden birisi kullandığı telefonda ki tarihi 1970ten öncesine ayarlamaya çalışsın ki? Bunu benim sormam garip çünkü denemedim değil. Ama eğer denemeye çalışırsanız fark edeceksiniz ki 1 Ocak 1970ten öncesine gidemezsiniz.
İşte sorun tam olarakta burada ortaya çıkıyor. Eğer zamanı 1 Ocak 1970 olarak ayarlarsanız telefonunuz bunu 0000000000000000000000000000000000000000000000 000000000000000000 olarak algıyacaktır. Normalde sorun yok dimi? Fakat son olan aramanızı veya gelen mesajın zamanını hesaplamaya kalkıştığı zaman negatif sayı bulamaz. Az önce bahsettiğim gibi Integer Underflow gerçekleşir ve olabilecek en yüksek sayıyı gösterir. Bu yaklaşık 04-12-292277026596 tarihini gösterir. Buda sistemin çökmesine sebebiyet veriyor.