2012-07-15 9 views
7

Gdy liczba całkowita jest poza zakresem typu, wartość maksymalna + 1 jest dodawana/odejmowana (w zależności od tego, która część zakresu była liczbą). PrzykładowoDlaczego niejawne konwersje C działają tak jak one?

unsigned short num = 65537; 

Num ma wartość 1 (65536 odjęto). Moje pytanie brzmi: dlaczego to się dzieje? Moja intuicja podpowiada mi, że ma to coś wspólnego z flagą do przenoszenia i flagą przelewu, ponieważ maksymalna wartość to zawsze 1111 ...

Z góry dziękuję!

+4

Obciąża ... – Mehrdad

+0

Doskonały przykład dlaczego powinieneś skompilować z zasadniczo wszystkimi możliwymi ostrzeżeniami włączonymi. Dlaczego tak jest w standardzie ... Nie mam pojęcia: p. (Chyba, że ​​masz na myśli konkretnie 1. To jest po prostu przepełnienie komplementu 2). – Corbin

+0

Przykład takiego komunikatu ostrzegawczego: 'ostrzeżenie: duża liczba całkowita niejawnie obcięta do typu bez znaku' – curiousguy

Odpowiedz

7

Na komputerze, który korzysta uzupełnienie do dwóch dla podpisanych liczb zasady konwersji do N -bitowa unsigned są równoważne odrzucając wszystko, ale niski zamówienie N bitów. w przypadku typowego sprzętu jest to najprostszy sposób na konwersję.

Standard zezwala na inne reprezentacje dla liczb całkowitych ze znakiem, ale stosuje te same reguły konwersji dla zachowania spójności. Może to wymagać dodatkowej pracy na takich maszynach, ale (a) takie maszyny są dość rzadkie i (b) i tak wydatek powinien być dość mały.

Powiązane problemy