2016-09-01 10 views
1

Wirklich einfache Frage hier. Ich habe ein wirklich einfaches Programm, um zwei Zahlen hinzuzufügen und die Summe dieser Zahlen auszudrucken (unten). Beim Ausführen des Programms funktioniert es wie erwartet und druckt 40 000 für 20 000 + 20 000. Aber wenn ich int a, b und summe zu short a, b und Summe ändere, bekomme ich -25 536 als Antwort. Wer kann erklären, warum das passiert? Ich habe eine Idee, aber ich würde es gerne von jemandem hören, der es weiß. Danke fürs Lesen.Beim Hinzufügen von zwei kurzen Zahlen

int a, b, sum; 

a = 20000; b = 20000; sum = a+b; 
printf("%d + %d = %d\n", a, b, sum); 
+1

Der maximale Wert von 'short' in Ihrer Implementierung ist' 32767'. – Barmar

+0

Sie könnten 'unsigned short' versuchen, wenn Sie die 65535 max wollen? – corn3lius

Antwort

5

auf Ihrem System short sind vermutlich 16 Bit, so dass der Wertebereich ist -32768-32767. 20000 + 20000 ist größer als der Maximalwert, so dass dies zu Überlauf führt, was zu undefiniertem Verhalten führt. Wenn Sie zu unsigned short wechseln, wird der Bereich 0 zu 65525, und die Addition wird funktionieren. Darüber hinaus ist der Überlauf wohldefiniert mit unsigned Ganzzahlen, er wird einfach umgebrochen, indem modulare Arithmetik verwendet wird, z. (unsigned short)65535 + 2 = 1.

1

Der Maximalwert eines Kurz signierten 32767

In binär ist, ist dies eine 16-Bit-Zahl, eher als die 32-Bit-Zahl (wie es der Fall mit ints ist). Weil es unterzeichnet ist, es wird wie folgt dargestellt:

0 11111 11111 11111 

Wenn Sie 1 bis dass hinzufügen, wird es

1 00000 00000 00000 

was wahrscheinlich ist, zurück zu -32768

Sie bekommen die Idee.

Verwandte Themen