2010-03-16 15 views

Antwort

3

Spaß mit Bits ...

cout druckt die Zahl als Unsigned lang, alle 64 Bits signifikant und Druck als unsigned binary integer sind (ich glaube, das Format hier %lu wäre).

printf(%u ... behandelt die Eingabe als normale Ganzzahl ohne Vorzeichen (32 Bits?). Dies führt dazu, dass die Bits 33 bis 64 abfallen - wobei null bleibt.

printf(%ld ... behandelt die Eingabe als eine 64-Bit-Zahl mit Vorzeichen und druckt sie einfach als solche aus.

Die Sache, die Sie über die letzten printf verwirrend finden können, ist, dass es den gleichen absoluten Wert wie cout gibt, aber mit einem Minuszeichen. Beim Anzeigen als vorzeichenlose ganze Zahl sind alle 64 Bits signifikant beim Erzeugen des ganzzahligen Wertes. Für vorzeichenbehaftete Zahlen ist das Bit 64 jedoch das Vorzeichenbit. Wenn das Vorzeichenbit gesetzt ist (wie in Ihrem Beispiel), zeigt es an, dass die verbleibenden 63 Bits als eine negative Zahl behandelt werden, die in 2's compliment dargestellt ist. Positive Zahlen werden einfach gedruckt, indem ihr Binärwert in Dezimalzahlen umgewandelt wird. Bei einer negativen Zahl geschieht jedoch Folgendes: Drucken Sie ein negatives Vorzeichen, XOR-Bits 1 bis 63 mit binären Bits, 1, addieren Sie 1 zum Ergebnis und drucken Sie den vorzeichenlosen Wert. Durch das Fallenlassen des Vorzeichenbits (Bit 64) enden Sie mit 63 '0' Bits, XORing mit '1' Bits ergibt 63 '1' Bits, addiert +1 und die ganze Sache rollt, um Ihnen eine vorzeichenlose Ganzzahl mit Bit zu geben 64 auf '1' gesetzt und der Rest auf '0' gesetzt - was dasselbe ist wie bei cout, ABER als negative Zahl.

Sobald Sie haben herausgearbeitet, warum die obige Erklärung richtig ist, dass Sie auch in der Lage sein sollten, es auszudrücken Sinn aus this

13

Sie belogen von printf es einen Wert ohne Vorzeichen vorbei, während das Format spec sagte, es wäre ein ein unterzeichnet sein.

+0

interessanten Art und Weise zu machen :) – Tim

17

%d ist ein signierter Formatierer. Die Neuinterpretation der Bits von currentTrafficTypeValueDec (2 zur 63. Potenz) als signed long ergibt einen negativen Wert. So printf() druckt eine negative Zahl.

Vielleicht möchten Sie %lu verwenden?

1

Die Variable trägt ihren Typ nicht in sich. Sie geben an, seinen Typ zu drucken. Versuchen:

printf("%lu \n", currentTrafficTypeValueDec); 

weil ld meand lange unterzeichnet das ist nicht wahr.

5

Weil Sie die 1 in das Vorzeichen Bit der Variablen verschieben. Wenn Sie es als einen signierten Wert drucken, ist es negativ.

+0

+1, besten Antwort. –

0

Sie drucken %ld oder eine lange Dezimalzahl mit Vorzeichen. Deshalb gibt es einen negativen Wert zurück.

Verwandte Themen