2010-01-27 9 views

Antwort

10

Sorry für die erste Antwort, hier ist eine Erklärung von den C++ Standards :)

Ist der Ausgang in keiner Weise vorhersehbar oder seine undefinierte ??

Es ist vorhersehbar. Es gibt zwei Punkte, nachdem in diesem Code suchen: Zunächst wird die Zuordnung von Wert, dass der Typ unsigned char nicht halten kann:

unsigned char c; 
c = 300; 

3.9.1 Grundtypen (Seite 54)

unsigned Integer, erklärt unsigned, werden die Gesetze der Arithmetik Modulo 2n gehorchen, wobei n die Anzahl der Bits in der Wertdarstellung von , die bestimmte Größe integer.41 ist)
...
41) Dies bedeutet, dass unsigned Arithmetik nicht überläuft, weil ein Ergebnis, das nicht durch die sich ergebende unsigned integer Typ reduziert dargestellt werden kann, die Anzahl, die man modulo größer ist als der größte Wert ist, dass kann durch den resultierenden vorzeichenlosen Integer-Typ dargestellt werden.

Grundsätzlich gilt:

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

Zweitens %d im Formatstring von printfunsigned char Variable drucken vorbei.
Dieser ysth hat es richtig;) Es gibt kein undefiniertes Verhalten, weil eine Promotion-Konvertierung von unsigned char zu Int passiert im Fall variadic arguments!

Hinweis: dass der zweite Teil der Antwort ist ein Umformulierung von dem, was in the comments of this answer gesagt wurde, aber es ist nicht meine Antwort ursprünglich.

+0

"numeric_limit" ist eigentlich "numeric_limits" –

+1

Wo kann ich all diese C++ - Standards lesen? –

+2

Sie müssen die offiziellen Dokumente kaufen, wenn Sie möchten, oder gehen Sie einfach auf http://www.open-std.org/jtc1/sc22/wg21/ und laden Sie den neuesten Entwurf kostenlos herunter: http: //www.open- std.org/jtc1/sc22/wg21/docs/papers/2009/n3000.pdf – AraK

4

Das Ergebnis der Zuordnung sollte vorhersehbar sein:

3.9.1

4 Unsigned Integer, ohne Vorzeichen angegeben, so erhält die Gesetze der Arithmetik Modulo gehorchen 2 n wobei n die Anzahl der Bits in der Wertdarstellung dieser bestimmten Ganzzahl.17)

17) Dies bedeutet, dass vorzeichenlose Arithmetik nicht überläuft, weil ein Ergebnis nicht represiert werden kann Durch den resultierenden vorzeichenlosen ganzzahligen Typ wird modulo die Zahl reduziert, die um eins größer als der größte Wert ist, der durch den resultierenden vorzeichenlosen Integer-Typ dargestellt werden kann.

Zusätzlich sizeof (char) als 1 definiert ist, und sizeof (unsigned char) = sizeof (char), so dass Sie das gleiche Ergebnis unabhängig von Implementierung sehen sollte (vorausgesetzt, Sie haben keine Bytes mit lustig Größen außer 8).

Die Warnung sagt Ihnen jedoch, dass das Ergebnis wahrscheinlich nicht das ist, was Sie beabsichtigten (zum Beispiel haben Sie vielleicht die Größe des Typs ohne Vorzeichen überschätzt?). Wenn das das ist, was Sie beabsichtigt haben, warum schreiben Sie nicht 300 % (1 << CHAR_BIT) (vorausgesetzt, dass 300 für Sie irgendwie von Bedeutung ist)?

Verwandte Themen