2016-04-27 8 views
0

Ich arbeite in C++ und ich hatte (als Übung) auf Papier 2 Antworten zu schreiben. Die erste Frage: Wenn wir die folgenden Deklarationen und Initialisierungen von Variablen:Wert von a + b und char Typ

unsigned char x=250, z=x+7, a='8'; 

Was ist der Wert des Ausdrucks?

z|(a-'0') // (here | is bitwise disjunction) 

Wir unsigned char haben, so dass die Zahl z=x+7 reduziert mod 256, also nach den Zahlen in binärer schreiben, ist die Antwort 9.


Die nächste Frage: a und b int Variablen, a=1 und .

Der Bereich von Int ist [-32768, 32767]. Wir haben hier keinen vorzeichenlosen Typ. Meine Frage ist: Was ist der Wert von ? Wie funktioniert das mit signierten Datentypen, wenn der Wert einer bestimmten Variablen größer als der Bereich dieses Datentyps ist?

+4

Was denken Sie über den Wert von a + b? –

+0

-32768 aber ich möchte sehen, wie das tatsächlich funktioniert. – shibuya

+0

"hier | ist bitweise disjunction" - ja, wir wissen, dass – harold

Antwort

3

Die nächste Frage: a und b int Variablen, a=1 und b=32767.

[...] Meine Frage ist: Was ist der Wert von a+b?

Es ist undefined behavior. Wir können Ihnen nicht sagen, was es sein wird. Wir könnten eine vernünftige Schätzung machen, aber was C++ betrifft, ist ein vorzeichenbehafteter Integer-Überlauf ein undefiniertes Verhalten.

+0

undefiniertes Verhalten oder Implementierung definiert? Ich meine den hier beschriebenen Unterschied: http://stackoverflow.com/questions/2397984/undefined-unspecified-and-implementation-defined-behavior – PiotrNycz

+0

@PiotrNycz Es ist undefiniertes Verhalten: http://Stackoverflow.com/a/16188846/ 4342498 – NathanOliver

+0

Vielen Dank für die Antwort! – shibuya

1

Es gibt keine operator+(unsigned char, unsigned char) in C++, es zuerst diese unsigned char Argumente int fördert und nur, dass dann die Zugabe, so dass die Art des Ausdrucks int ist.

Und dann das int, dessen Wert zu groß ist, um in unsigned char zu passen, wird zu unsigned char konvertiert.

Der Standard sagt:

A prvalue eines Integer-Typ kann auf eine prvalue eines anderen Integer-Typ umgewandelt werden. Ein Pr-Wert eines nicht gekapselten Aufzählungstyps kann in einen Pr-Wert eines Integer-Typs konvertiert werden. Wenn der Zieltyp nicht vorzeichenbehaftet ist, ist der resultierende Wert die am wenigsten vorzeichenlose Ganzzahl, die kongruent zur Ganzzahl ist (Modulo 2 ** n, wobei n die Anzahl der Bits ist, die für den unsignierten Typ verwendet werden). [Anmerkung: In einer Zweierkomplementdarstellung ist diese Umwandlung konzeptionell und es gibt keine Änderung im Bitmuster (wenn keine Kürzung erfolgt). - Endnote]

+0

@KerrekSB Sie haben Recht, ein Angebot hinzugefügt. –

0

Für die zweite Frage ist die Antwort unbestimmt.

Sie können es überprüfen, sich wie folgt aus:

#include <iostream> 

using namespace std; 

int main() 
{ 
    int a = 1; 
    int b = 32767; 
    int c = a+b; 
    cout << c << endl; 
} 

Das Ergebnis auf Ihrem Rechner ab.

+0

Ein 'int' kann den Bereich [-32768, 32767] haben. –

+0

* Für die zweite Frage ist die Antwort in der Tat -32768 * möglicherweise auf Ihrem Computer und der OP-Maschine, aber in C++ ist es UB. Du kannst nicht sagen, es wird immer -32768 – NathanOliver

+0

Du hast Recht, mein Schlechter. –

Verwandte Themen