Na ryzyko bycia dół głosowaniu, może chcesz napisać swoją własną metodę wartości bezwzględnej, w zależności o tym, do czego go używasz. Poniższy fragment kodu (przepraszam to w C#, ale ma zastosowanie ta sama zasada):
short i = -32768;
int iAbs = Math.Abs(i);
chętnie skompilować, ale po uruchomieniu, druga linia wygeneruje OverflowException z pomocny komunikat „negując minimalną wartość Liczba podwójnych uzupełnień jest nieprawidłowa. " W tym przypadku, ponieważ i jest typu short, kompilator wybiera przeciążenie Math.Abs, które akceptuje skrót i zwraca skrót, a +32768 nie jest poprawnym shortem, więc metoda generuje wyjątek, nawet jeśli myślałeś, że spodziewasz się ten problem, czyniąc iAbs int.
ten fragment:
short i = -32768;
int iAbs = Math.Abs((int)i);
będzie skompilować i wykonać bez wyjątku, ale to trochę niezgrabne kodować ten sposób. Moim zdaniem jest to bardzo podstępny błąd, ponieważ jest tak rzadko spotykany w realnym świecie (ponieważ istnieje tylko jedna wartość dla każdego typu, który wygeneruje ten wyjątek). Niestety, niestety, napotkam ten błąd za każdym razem, gdy używam Math.Abs do normalizowania danych dźwiękowych (co jest zwykle krótką [] tablicą), więc mam nawyk pisania własnego wrappera wokół Math.Abs, który obsługuje wszystkie to dla mnie i po prostu zwraca double:
public double AbsThatDoesntSuck(short value)
{
return Math.Abs((double)value);
}
z przeciążeniami dla każdego innego typu muszę obsługiwać. W pewnym sensie rozumiem, dlaczego Math.Abs został napisany, aby zachowywać się w ten sposób, ale może zdecydowanie ugryźć w tył nieświadomych.
To łatwe, dzięki! – Cyclone
Cóż, przynajmniej link MSDN zawiera podlinkami, które wspominają o potencjalnym problemie z przepełnieniem, nawet jeśli nikt nie pomyślałby, aby je kliknąć. – MusiGenesis
Przy okazji, myślę, że powinieneś otrzymać natychmiastową premię za reputację 20K za swoją pracę w Daily WTF. – MusiGenesis