19 Kasım 2020 Perşembe

Unsigned Integer Overflow

Giriş
Unsigned integer'lar varsa overflow sadece hesaplamalarda olabiliyor. Yani iki tane değişkeni toplarsak veya herhangi bir matematiksel işleme sokarsak yanlış değer elde edebiliriz.

Bu durumu düzeltmek için bir kaç basit numara var.

Örnek
Şöyle yaparsak overflow olabilir
Arrays.sort(arr, (a,b)-> a[1]-b[1]);
Şöyle yaparız
Arrays.sort(arr, (a,b) -> a[1]<b[1] ? -1 : 1);
Örnek - ortalama bulmak
Şöyle yaparsak overflow olabilir
mid = (start + end)/2.
Şöyle yaparız
mid = start + (end-start)/2;
Örnek - ortalama bulmak
Şöyle yaparız. Burada normalde toplamadan dolayı oluşacak overflow, bölme işlemi ile iptal ediliyor gibi düşünülebilir. Nedenc ile çarpma yapıldığını ben de anlamadım :)
#include <stdint.h>

uint64_t average_of_three(uint64_t a, uint64_t b, uint64_t c) {
  uint64_t hi = (a >> 32) + (b >> 32) + (c >> 32);
  uint64_t lo = hi + (a & 0xffffffff) + (b & 0xffffffff) + (c & 0xffffffff);
  return 0x55555555 * hi + lo / 3;
}

Hiç yorum yok:

Yorum Gönder