2016-12-29 4 views
0

Ich habe einen überzeichneten Überlauf viele Male gemacht, aber jedes Mal Turbo C Wraparound. Zum Beispiel:Warum Turbo C Wraparound signed Integer Overflow jedes Mal, obwohl vorzeichenbehafteter Ganzzahlüberlauf nicht definiert ist?

#include <stdio.h> 

void main() { 
    int i = 100000; 
    printf("%d", i); 
    getch(); 
} 

Der Ausgang ist -31072, die die erwartete Ausgabe ist, wenn Wraparound erfolgt. In binär 100000(dec) ist 11000011010100000 und letzten 16 Bits sind, die 1000011010100000 speichern. In zwei komplementären Darstellungen ist 1000011010100000-31072.

+0

Werfen Sie einen Blick auf [diese] (https://www.youtube.com/watch?v=yG1OZ69H_o-). Es macht einen netten Job, mehr undefiniertes Verhalten zu erklären und spricht speziell über undefiniertes Verhalten und die Art und Weise, wie wir Hyperble manchmal verwenden, um es zu beschreiben. – wally

Antwort

2

Ihr Beispiel enthält keine signierten Überläufe, daher gibt es kein undefiniertes Verhalten.

(INT_MAX Unter der Annahme, weniger als 100000.)

Die Zuordnung:

int i=100000; 

eine implizite Umwandlung von einem Typ langen durchführt, die der Typ des ganzzahlige Konstante ist 100000, int einzugeben. Dieses Ergebnis der Umwandlung ist implementationsdefiniert (oder ein implementierungsdefinierter Trap ist ein Signal).


(Zitiert nach: ISO/IEC 9899: 201x 6.3.1.3 und ohne Vorzeichen ganze Zahlen 3)
Andernfalls wird der neue Typ unterzeichnet und der Wert darin nicht dargestellt werden kann; entweder das Ergebnis ist implementierungsdefiniert oder es wird ein implementierungsdefiniertes Signal ausgegeben.

Verwandte Themen