Funktion vom Typ unsigned int zurück negative Zahl
Wow, ich dachte, ich wusste, dass mein C++, aber das ist seltsam,
Diese Funktion gibt einen unsigned int, also ich dachte, dass bedeutet ich werde nie eine negative Zahl zurückgegeben, richtig?
Die Funktion bestimmt, nach wie vielen Stunden vor oder hinter der UTC Sie sind. Also für mich ich bin in Australien, Sydney, so bin ich +10 GMT, was bedeutet, ich bin UTC = LocalTime + (-10). Daher die GetTimeZoneInformation richtig bestimmt, ich bin -10.
ABER meine Funktion gibt einen unsigned int, also sollte es nicht Rückkehr 10 nicht -10?
unsigned int getTimeZoneBias()
{
TIME_ZONE_INFORMATION tzInfo;
DWORD res = GetTimeZoneInformation( &tzInfo );
if ( res == TIME_ZONE_ID_INVALID )
{
return (INT_MAX/2);
}
return (unsigned int(tzInfo.Bias / 60)); //convert from minutes to hours
}
TCHAR ch[200];
_stprintf( ch, _T("A: %d\n"), getTimeZoneBias()); //this prints out A: -10
debugLog += _T("Bias: ") + tstring(ch) + _T("\r\n");
- Teil des Problems ist, dass der Druck unsigned erfordert
%u
, in diesem Fall ist es ein Duplikat von diese Frage, aber es gibt eine Menge mehr hier Probleme mit dem Gießen hin und her, int & unsigned.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist, was ich denke, passiert ist:
Den Wert
tzInfo.Bias
ist eigentlich -10. (0xFFFFFFF6
)Auf den meisten Systemen, die ein Ganzzahl mit Vorzeichen in eine Ganzzahl ohne Vorzeichen mit der gleichen Größe tut nichts, um die Darstellung.
Damit die Funktion noch zurück
0xFFFFFFF6
.Aber, wenn Sie drucken, Sie drucken es als eine vorzeichenbehaftete Ganzzahl. So druckt er
-10
. Wenn Sie es drucken, als eine vorzeichenlose Ganzzahl, werden Sie wahrscheinlich bekommen4294967286
.Was sind Sie wahrscheinlich versuchen zu tun ist, um den absoluten Wert der Zeit Unterschied. So, die Sie konvertieren möchten diese -10 in 10. In die Sie zurückkehren sollte
abs(tzInfo.Bias /60)
.Den Sie drucken möchten, ein
unsigned int
alssigned int
. Ändern%d
zu%u
Das problem ist, dass Ganzzahlen nicht positiv oder negativ, indem Sie sich für die meisten Computer. Es ist in der Art, wie Sie interpretiert werden.
So große Ganzzahl sein könnte, nicht von einer kleinen (absoluter Wert) negativ.
Fehler in Ihrem
_T
nennen. Es sollte sein:Die Funktion hat Rückkehr eine nicht-negative ganze Zahl. Wenn Sie jedoch die falsche printf-Bezeichner, den Sie sind, wodurch es zu bekommen knallte aus dem Stapel als eine ganze Zahl. In anderen Worten, werden die bits falsch interpretiert werden. Ich glaube, das ist auch zu undefiniertem Verhalten.
"%u"
format erwartet ein argument vom Typunsigned int
;"%d"
erwartet ein argument vom Typint
. Einunsigned int
Objekt ist immer nicht-negativ (nicht unbedingt positiv; es könnte 0 sein), aber wenn Sie behaupten, dass es einint
, kann es leicht erscheinen, negativ zu sein. Zum Beispiel, wennint
ist 32 bit, dann dieunsigned int
Wert4294967295
hat die gleiche Darstellung wie dieint
Wert-1
.(unsigned int)-10
ist zu groß, um dargestellt als einint
auf ein Zweierkomplement-Architektur hätte ich gedacht, dass das Verhalten war nicht definiert.Als andere Leute haben darauf hingewiesen, wenn Sie gegossen, um ein
unsigned int
Sie wirklich sagen, dass der compiler die Verwendung der Muster von bits in derint
und verwenden Sie es als eineunsigned int
. Wenn Ihr computer verwendet Zweierkomplement, als die meisten tun, dann ist Ihre Zahl wird interpretiert alsUINT_MAX-10
statt10
als Sie erwartet haben. Wenn Sie die%d
Formatbezeichner, der compiler geht wieder auf die gleiche bit-Muster wie einint
statt einerunsigned int
. Dies ist, warum Sie immer noch-10
.Wenn Sie möchten, dass der absolute Wert der ganzen Zahl, die Sie versuchen sollten, um es mathematisch anstelle von einem cast.