2017-12-29 26 views
-3

Was passiert, wenn die ganze Zahl ihre Grenze überschreitet? Die Ausgabe ist 3595, und wie wird es kommen? Und es ist 2-Byte-Typ?Was passiert, wenn eine ganze Zahl addiert oder multipliziert wird?

#include<stdio.h> 
#include<conio.h> 
void main() 
{ 
    int n=12,res=1; 
    clrscr(); 
    while(n>3) 
    { 
    n+=3; 
    res*=3; 
    } 
    printf("%d",n*res); 
    getch(); 
} 
+0

Verwandte: https://stackoverflow.com/questions/3948479/integer-overflow-and-undefined-behavior – Barmar

+1

Um diese Frage zu beantworten, sich (was Sie tun müssen, wegen undefinierten Verhalten, was eine generische Antwort verhindert), sollten Sie printf() großzügig hinzufügen. Drucken Sie auch 'sizeof (int)', um die Antwort auf Ihre zweite Frage in Ihrer Umgebung zu finden. – Yunnosch

Antwort

3

Das Programm wird nicht definiertes Verhalten haben.

Die von Ihnen angegebene Bedingung ist nicht terminierend. Es ist eine Schleife, in der die Bedingung nie auf eine wohldefinierte Weise beendet wird.

Sie werden weiter multiplizieren und dann wird es einmal überlaufen. Und dann, wenn Sie ein negatives Ergebnis in n oder <=3 bekommen, dann wird es aufhören. Und in der Zwischenzeit ist auch res überflogen worden. Als Ergebnis werden Sie nicht sicher sein, wie sich dieses Programm verhält. Wir können nicht sicher sein, was das Ergebnis sein wird.

+0

Ja, ich verstehe, aber wenn wir dieses Programm im Compiler ausführen, wird sicherlich eine Antwort bekommen, was passiert, wenn es ausgeführt wird? – Mathan

+0

@Mathan .: Ja ... das wird erklärt. Du kannst nie sicher sein. Meistens wird es nach einem bestimmten Punkt überlaufen und dann wird das Ergebnis etwas definitives sein, aber es hängt wieder von der Architektur ab - wie es Überlauf-Sachen behandelt. Du kannst nie sicher sein. Vielleicht würde sich Ihre Professorenmaschine anders verhalten als Ihre, wenn Sie die Antwort überprüfen. :) – coderredoc

1

Das Verhalten ist nicht definiert - Sie sollten sich nicht auf etwas Bestimmtes verlassen. Häufige Manifestationen auf int Überlauf sind:

  1. Wraparound so dass 1 + INT_MAX wird INT_MIN. Dies ist, was jeder Windows PC, auf den ich gestoßen bin, tut. Das von der Operation erzeugte Bitmuster stimmt genau mit dem Cousin unsigned überein.

  2. Spann so dass 1 + INT_MAX wird INT_MAX. Ich habe das zuletzt auf einer Maschine beobachtet (mit signiert Magnitudeint), die eine Variante von UNIX in den 1990er Jahren betrieben.

+0

Ein moderner Compiler könnte nur die Variable 'n' optimieren, da die Bedingung immer wahr ist. – willys

+0

@willys: Obwohl ich bisher noch keinen gefunden habe, der das macht, oder? – Bathsheba

Verwandte Themen