2016-05-02 19 views
1

Ich verwende std::bitset, um einen Dezimalwert in seine binäre Darstellung zu konvertieren, aber ich bin nicht sicher, ob bitset vorzeichenbehaftete Werte behandelt oder nicht.Bitset und signierte Werte

Zum Beispiel bitset<10>(5) gibt Ihnen 0000000101. Aber was ist, wenn es bitset<10>(-5)?

Hier ist mein Code in spezifisch:

while (getline(ss, token, ',')){ 
    ss.ignore(); 
    myString.push_back(token); 
} 
myString[0].erase(0, 1); 
myString[1].erase(0, 1); 
rt = bitset<7>(stoi(myString[0])).to_string(); 
ra = bitset<7>(stoi(myString[1])).to_string(); 
i10 = bitset<10>(stoi(myString[2])).to_string(); 

und die i10 unterzeichnet werden soll. Wird mein aktueller Code signierte Werte verarbeiten? myString wird die Dezimaldarstellung enthalten, die von einem Benutzer eingegeben wird, aber ich muss etwas verketten und in eine Datei schreiben, so dass ich im Prinzip in Zeichenfolgen umwandeln kann.

Antwort

2

bitset behandelt nicht unterzeichnet Heit selbst. Der Konstruktor, den Sie aufrufen, benötigt eine ganze Zahl unsigned. Von [bitset.cons]:

constexpr bitset(unsigned long long val) noexcept; 

Effekte: Konstruiert ein Objekt der Klasse bitset<N>, die ersten M Bit-Positionen zu den entsprechenden Bit-Werte in val initialisiert. M ist der kleinere von N und die Anzahl der Bits in der Wertdarstellung (3.9) von unsigned long lang. Wenn M < N, werden die verbleibenden Bitpositionen auf Null initialisiert.

Also, wenn Sie es mit -5 nennen, wird das zu unsigned long long als 0xfffffffffffffffb umgewandelt. Die unteren 10 Bits davon sind 0x3fb, die Sie erhalten. Aber es ist unsigniert. Beiden Konvertierungsfunktionen geben Ihnen einen Wert ohne Vorzeichen zurück (von [bitset.members]):

unsigned long to_ulong() const; 
unsigned long long to_ullong() const; 

All das ist zu sagen - ein bitset ein Satz von Bits ist. Es hat kein Zeichen. Das erste Bit ist nicht besonders - es ist nur ein weiteres Bit.

+0

Huh das ist seltsam - für mich gibt es immer die richtige Zweierkomplement-Binärdarstellung der Zahl – tobspr

+0

@Barry Gibt es einen Konstruktor, der unterzeichnet behandelt? – Javia1492

+0

@ Javia1492 Warum sollte es? – Barry

1

Bitset gibt die Binärdarstellung zurück. Da negative Zahlen mit dem Zweierkomplement gespeichert werden, erhalten Sie ihre Darstellung im Zweierkomplement. Zum Beispiel:

cout << bitset<12>(-5).to_string(); 
// Prints 111111111011 
+0

Negative Zahlen werden nicht unbedingt als Zweierkomplement gespeichert. –

0

Werfen Sie einen Blick auf die Konstruktoren von std::bitset. Wie Sie herausfinden werden, hat kein Konstruktor eine signierte Ganzzahl akzeptiert. Der einzige Integralkonstruktor ist derjenige, der eine unsigned long akzeptiert.

Wenn Sie also eine ganze Zahl übergeben, wird sie zuerst in unsigned konvertiert. Was passiert, ist, dass der konvertierte Wert ein positiver Wert ist, genauso wie der vorzeichenbehaftete Modulo der Maximalwert des vorzeichenlosen Typs.