Na początek kod, który podałeś, nie będzie się nawet kompilował, ponieważ cała matematyka całkowita o rozmiarach mniejszych niż int
jest wykonywana z int
. Zatem wynikiem a + b
jest int
, a int
nie będzie domyślnie konwertować na ubyte
, ponieważ jest to konwersja zawężająca. Jeśli chcesz go przypisać do c
, musisz go przesłać.
ubyte c = cast(ubyte)(a + b);
Teraz, to oczywiście Niesprawdzony konwersji i będzie szczęśliwie rzeczy 44
do c
(ponieważ jest to wynikiem obsady danej wartości 100
i 200
). Jeśli chcesz zaznaczony konwersję, a następnie użyć std.conv.to
:
ubyte c = to!ubyte(a + b);
To rzuci ConvOverflowException
(która jest podklasą ConvException
), ponieważ wynik nie będzie pasował do żądanego typu.
Jeśli chcesz sam wykonać rzut, a następnie sprawdzić, czy doszło do przepełnienia, to jesteś w zasadzie tą samą łodzią, co C/C++, i nie ma żadnych flag przenoszenia ani niczego podobnego. Być może takie rzeczy istnieją, jeśli sprawdzasz za pomocą kodu zespołu. Nie wiem Ale język z pewnością nie zapewnia czegoś takiego. std.conv.to
oblicza go, sprawdzając wynik i sprawdzając, czy jest zbyt duży lub zbyt mały (w zależności od znaku i rodzaju argumentu).
mają to samo pytanie dla C++ http: //stackoverflow.com/questions/199333/best-way-to-detect-integer-overflow-in-cc –
i Assembly http://stackoverflow.com/ question/3925528/x86-assembly-inc-and-dec-instruction-and-overflow-flag –