2010-01-27 10 views

Odpowiedz

10

Niestety na pierwszej odpowiedzi, tutaj jest wyjaśnienie ze standardami C++ :)

Czy wyjście w żaden sposób przewidywalny lub jej niezdefiniowana ??

Jest przewidywalny. Istnieją dwa punkty opiekować w tym kodzie: pierwsze, przyporządkowanie wartości, że typ unsigned char nie może posiadać:

unsigned char c; 
c = 300; 

3.9.1 Podstawowe typy (strona 54)

liczb całkowitych, stwierdził bez znaku, powinny przestrzegać prawa arytmetyczna modulo 2n, gdzie n oznacza liczbę bitów w reprezentacji wartość że szczególną wielkość integer.41)
...
41) Oznacza to, że bez znaku arytmetyczna nie przeleje ponieważ wynik, który nie może być reprezentowane przez otrzymany unsigned całkowita jest zmniejszona modulo liczba, która jest większa niż jeden największą wartość, która może być reprezentowany przez wynikowy numer całkowity typu unsigned .

Zasadniczo:

c = 300 % (std::numeric_limits<unsigned char>::max() + 1); 

drugie, przechodząc %d w ciągu formatu printf wydrukować unsigned char zmienną.
Ten jeden ysth ma to prawo;) Nie ma niezdefiniowanego zachowania, ponieważ promocyjna konwersja z unsigned char do int dzieje się w przypadku variadic arguments!

Uwaga: druga część odpowiedzi to przepakowanie tego, co zostało powiedziane w the comments of this answer, ale nie jest to moja pierwotna odpowiedź.

+0

"numeric_limit" to w rzeczywistości "numeric_limits" –

+1

Gdzie mogę przeczytać wszystkie te standardy C++? –

+2

Musisz kupić oficjalne dokumenty, jeśli chcesz, lub po prostu przejdź do http://www.open-std.org/jtc1/sc22/wg21/ i pobierz najnowszą wersję roboczą za darmo: http: //www.open- std.org/jtc1/sc22/wg21/docs/papers/2009/n3000.pdf – AraK

4

Efektem zadania powinny być przewidywalne:

3.9.1

4 liczb całkowitych bez znaku, oświadczył bez znaku, powinien przestrzegać prawa arytmetyki modulo 2 n gdzie n jest liczba bitów w reprezentacji wartości tego konkretnego rozmiaru liczby całkowitej.17)

17) Oznacza to, że niepodpisana arytmetyka nie powoduje przepełnienia, ponieważ wynik, którego nie można powtórzyć przypisany przez wynikowy typ liczby całkowitej bez znaku jest zredukowany modulo o liczbę większą od największej wartości, która może być reprezentowana przez wynikowy typ liczbowy bez znaku.

Ponadto, sizeof (char) jest zdefiniowana jako 1 i sizeof (unsigned char) = sizeof (char), więc powinieneś zobaczyć ten sam wynik, niezależnie od implementacji (zakładając, że nie masz bajtów z zabawnymi rozmiary inne niż 8).

Jednak ostrzeżenie informuje użytkownika, że ​​prawdopodobnie wynik nie jest zgodny z zamierzeniem (na przykład, być może zawyżono rozmiar niepodpisanego typu?). Jeśli to jest to, co zamierzałeś, dlaczego nie napisać: 300 % (1 << CHAR_BIT) (zakładając, że 300 jest w jakiś sposób znaczący dla ciebie)?

Powiązane problemy