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ź.
"numeric_limit" to w rzeczywistości "numeric_limits" –
Gdzie mogę przeczytać wszystkie te standardy C++? –
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