Ich habe eine Frage zum nächsten Code:
%Vor% Wenn ich den Code auf meinem Computer starte, erhalte ich keinen Laufzeitfehler und ich sehe y = -nan(0x8000000000000)
. Warum ist es kein Laufzeitfehler, durch Null zu teilen?
Zusätzlich, wenn ich die erste Zeile in int x = 0;
ändere
jetzt gibt es einen Laufzeitfehler. Was ist der Unterschied?
Man kann sich nicht auf dieses "Arbeiten" verlassen (dh die ganze Zeit das gleiche tun, portabel), es ist ein undefiniertes Verhalten in C für den zweiten Fall, und auch für den ersten Fall, wenn Ihre Implementierung nicht definiert __STDC_IEC_559__
(das ist, glaube ich, selten in diesen Tagen).
C99, § 6.5.5 / 5
Das Ergebnis des / Operators ist der Quotient aus der Division des ersten Operanden durch den zweite; Das Ergebnis des% -Operators ist der Rest. In beiden Vorgängen, wenn der Wert von der zweite Operand ist Null, das Verhalten ist nicht definiert.
Die Tatsache, dass Sie in einem Fall eine "Not a Number" bekommen und nicht in der anderen, ist die, die in der Gleitkomma-Arithmetik ausgeführt wird, wo Sie in Ihrer Implementierung (gemäß IEEE 754 Division durch Null-Semantik) arbeiten. , 0/0
ergibt ein NaN.
Im zweiten Fall verwenden Sie Ganzzahlarithmetik - undefiniertes Verhalten, es gibt keine Vorhersage, was passieren wird.
Der Grund, warum Sie keine Ausnahme oder Fehler erhalten, ist, dass für ein Doppel unendlich und NaN definiert sind (siehe IEEE floating point ), aber wenn Sie dasselbe für Integer versuchen, erhalten Sie einen Fehler, weil NaN / Infinity nicht definiert sind
Dies liegt daran, dass der Standard IEEE 754 spezielle Werte für positive und negative Unendlichkeit sowie "keine Zahl" für Floating definiert -Punktwerte.
Nicht-Gleitkomma-Typen wie int
haben diese speziellen Werte nicht definiert und daher wird die Laufzeit aufgrund eines nicht behandelten Fehlers beendet.
Dies ist nicht C-spezifisch, Sie werden ein sehr ähnliches (wenn nicht das gleiche) Verhalten in anderen Sprachen sehen, einfach weil diese Funktionalität auf Hardware basiert.
Tags und Links c floating-point nan