C ++ Unterlauf und Überlauf

Hallo, ich bin neu hier, also lass es mich bitte wissen, wenn etwas nicht stimmt und ich werde versuchen, es beim nächsten Mal besser zu machen.

Ich versuche zu verstehen, wie Unterlauf und Überlauf in C ++ funktionieren. Mein Verständnis ist, wenn der Bereich einer Variablen überschritten wird, beginnt er am anderen Ende des Bereichs. Wenn also das Minimum von short -32768 ist und wir -1 machen, sollte der neue Wert SHRT_MAX sein. (32767) Hier ist mein Code:

<code>#include<iostream.h>
#include<limits.h>
#include<conio.h>
int main ( void )
{
 int testpositive =INT_MIN ;
 short testnegative = SHRT_MIN ; 
 cout<< SHRT_MIN<<"\n";
 cout << testnegative-1<<"\n";
 cout << INT_MIN << "\n";
 cout << testpositive-1 << "\n"; 
 cout<<testpositive-2;
 getch();
 return 0;
}   
</code>
 Knownow04. Apr. 2012, 15:43
Es funktioniert und jetzt verstehe ich.
 L. F.19. Jan. 2019, 06:08
Erwägen Sie die Verwendung#include <iostream> anstatt#include <iostream.h>.
 Hans Passant04. Apr. 2012, 15:05
Operanden werden zu befördertint erstens gibt es also keinen überlauf. Ziehen Sie in Betracht, das Ergebnis auf "Kurz" zurückzusetzen, um zu sehen, was Sie sich erhoffen.

Antworten auf die Frage(4)

Normalerweise ja. Da dies jedoch C ++ ist und C ++ durch den C ++ - Standard geregelt wird, müssen Sie wissen, dass es sich um Überläufe handeltundefiniertes Verhalten.

Obwohl das, was Sie angegeben haben, wahrscheinlich auf den meisten Plattformen zutrifft, ist es in keiner Weise garantiert, verlassen Sie sich also nicht darauf.

 mabraham11. Dez. 2017, 01:22
unterzeichnet Überläufe sind undefiniertes Verhalten

unsigned Typen. Für normale Integer-Typen mit Vorzeichen sagt der C ++ - Standard stattdessen einfach, dass nichts passieren kann.

Wenn es sich um einen x86-Prozessor (oder die meisten anderen modernen Prozessoren) handelt, ist das Verhalten tatsächlich genau das, was Sie beschreiben, und für die CPU besteht kein Unterschied zwischen einem vorzeichenbehafteten Wert und einem vorzeichenlosen Wert (es gibt vorzeichenbehaftete und vorzeichenlose)Operationen, aber der Wert selbst sind nur Bits).

Beachten Sie, dass Compiler davon ausgehen können (und die meisten modernen Optimierer-Compiler tatsächlich davon ausgehen), dass in einem korrekten Programm und beispielsweise in Code wie dem Folgenden kein vorzeichenbehafteter Ganzzahlüberlauf auftreten kann:

<code>int x = foo();
int y = x + 1;
if (x < y) {
    do_something();
} else {
    do_something_else();
}
</code>

es steht einem Compiler frei, den Test zu überspringen und dieelse Verzweigen Sie vollständig in den generierten Code, da in einem gültigen Programm ein signierter intx ist immer kleiner alsx+1 (Ein signierter Überlauf kann nicht als gültiges Verhalten angesehen werden.) Wenn Sie ersetzenint mitunsigned int Der Compiler muss jedoch Code für den Test und für die else-Verzweigung generieren, da dies für nicht signierte Typen möglich istx > x+1.

 650218. Juli 2018, 08:06
@ouah: Ja ... hat einen Hinweis zu den Annahmen hinzugefügt, die Compiler bei der Analyse des Codes machen können
 ouah04. Apr. 2012, 15:06
Moderne Compiler nutzen signierte Überläufe als undefiniertes Verhalten, um Optimierungen durchzuführen. Selbst wenn das Verhalten auf CPU-Ebene definiert ist, ist dies keine Garantie dafür, dass Ihr Programm kein undefiniertes Verhalten aufruft.

SHRT_MAX es ist undefiniert.

 James Kanze04. Apr. 2012, 15:03
Das Verhalten ist undefiniert. Das Programm könnte sehr gut abstürzen.

Zum Beispiel:

INT_MIN - 1

-INT_MIN

sind Ausdrücke, die undefiniertes Verhalten hervorrufen.

SHRT_MIN - 1 und-SHRT_MIN sind kein undefiniertes Verhalten in einer Umgebung mit 16-Bitshort und 32-Bitint denn bei ganzzahligen Beförderungen wird der Operand nach befördertint zuerst. In einer Umgebung mit 16-Bitshort undintsind diese Ausdrücke auch undefiniertes Verhalten.

Ihre Antwort auf die Frage