====Integer overflow==== Do integer overflow-a dolazi kada se pokuša pohraniti vrijednost u varijablu koja je veća od maksimalno dopuštene. Sve numeričke vrijednosti tokom izvođenja operacija u kojima su oni operandi sačuvane su u registrima. U današnje vrijeme to su najčešće 64 bitni registri. Veličine riječi u asemblerskom jeziku: Byte (8 bitova) Word (2 bajta) Doubleword (4 bajta) Quadword (8 bajta) Ovisno o jeziku, operacije velikim brojevima znaju biti implementirane stringom (npr. python) čime se izbjegava mogućnost integer overflowa. ==Primjer:== Recimo da je varijabla a definirana kao byte. Byte ima 8 bitova, što znači da je u nju moguće upisati 2^8 (256) različitih vrijednosti: *U unsigned notaciji: [0, 255] *U signed notaciji : [-128, 127] Najveća vrijednost koju ona može sadržati u sebi jest broj 1111 1111(2) S obzirom da su svi numerički operandi nalaze u registru (npr. 64 bitnom) zapis vrijednosti varijable a (recimo broj 255) u registru koji sadržu njenu vrijednost biti će : 00000...1111 1111(2) gdje je broj nula 64-8 = 56. Kada bismo tom registru dodali vrijednost 1, zapis bi izgledao ovako: 0000....1 0000 0000(2), što bi značilo da se vrijednost varijable promijenilo u 0 umjesto 256, jer samo prvih 8 bitova označavaju raspon varijable a. Kada bi se taj registar dalje koristio za upcastanje (npr. prikaz riječi dword) njegova vrijednost bi bila 256. Sličan princip vrijedi i za overflowanje cijelog registra, odnosno riječi veličine qword (8 bajtova, 64 bita). Sklopovlje za zbrajanje registara interno koristi tzv. carry flag (rflags/eflags/status registra) To znači da kada se registar preplavi (odnosno upiše vrijednost veća od 2^64) on ispravlja svoj sadržaj (odnosno prikazuje upisanu vrijednost % 2^64 gdje je % operacija modulo-ostatak) i postavlja postavlja carry flag. Kada bi se taj registar dalje koristio za operacije bile bi prikazane vrijednost manje od 2^64.