ProgramlamaGömülü Geliştirici / Sistem Geliştirici

Rust'ta tür dönüştürmesi (type casting) nasıl çalışır? Sayısal türler arasında dönüşüm yaparken hangi özellikler ve potansiyel tehlikeler vardır?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

Rust'ta tür dönüştürmesi (type casting) as anahtar kelimesi ile gerçekleştirilir. Bu, bir türü diğerine açıkça dönüştürür:

let x: i32 = 10; let y: u8 = x as u8;

Rust, C veya C++ gibi örtük dönüşümleri (implicit cast) gerçekleştirmez. Bu, veri kaybı veya taşma sorunlarıyla ilgili birçok hatayı önler.

Özellikler:

  • Sayısal türler arasındaki dönüşüm yalnızca açıkça mümkündür.
  • Bir sayısal türden diğerine dönüştürme sırasında taşmalar ve anlamlı bit kayıpları meydana gelebilir.
  • Boyutları uyumlu olan işaretçilere ve değerlere uygulanması mümkündür, ancak dikkat gerektirir.

Potansiyel tehlikeler:

  • Örneğin, i32'den u8'e dönüştürme sırasında değer aralığını aşarsa, fazla yüksek bitler basitçe atılır — bu beklenmedik davranışlara yol açabilir.
  • Açık dönüşüm, çalışma zamanında panik veya hata oluşturmaz!

Örnek:

let big: u16 = 300; let small: u8 = big as u8; // small == 44, çünkü 300 % 256 = 44

Kandırmaca soru

i8 türünden negatif bir sayıyı as anahtar kelimesi ile u8 türüne dönüştürürseniz ne olur?

Cevap: Değer, derleme hatası veya çalışma zamanı panik oluşturmaz. Bunun yerine, değer bitleri işaretsiz bir sayı olarak yorumlanır:

let x: i8 = -1; let y: u8 = x as u8; // y == 255

Konuyla ilgili bilgilerin eksik olmasından kaynaklanan gerçek hatalara dair örnekler.


Hikaye

Finansal bir uygulamada aktarım miktarı verileri başlangıçta i32 olarak saklanıyordu. Geliştirici bu verileri sınır kontrolleri yapmadan u32'ye dönüştürmeye karar verdi ve bu, negatif değerlerin hatalı işlenmesine neden oldu — değerler beklenmedik şekilde büyük pozitif sayılara dönüşerek iş mantığı doğrulamasını geçti!


Hikaye

Mikrodenetleyici oyununda hız seviyelerinin değiştirilmesi, iki seviye değerinin farkı olarak hesaplandı: sonuç negatif olabiliyordu. Sonucu yuvarlamak için as u8 dönüşümü kullanıldı ve taşmalar göz ardı edildi. Sonuç olarak, negatif değerler wrap-around davranışından dolayı büyük pozitif sayılara dönüştüğü için hızlar maksimum seviyede “dondu”.


Hikaye

Bir ağ uygulamasında veri tamponu kopyalanırken, uzunluk işaretçiler arasındaki fark (usize) olarak hesaplandı ve ardından as ile u32'ye dönüştürüldü. Büyük bellek alanlarında (>4 GB) bu, değerin kesilmesine neden oldu ve büyük dosyanın iletimi sırasında veri kaybı ve hatalara yol açtı.