Ich habe eine Ganzzahl ohne Vorzeichen, aber wenn ich sie mit% d ausdrucke, gibt es dort manchmal einen negativen Wert?C Unsigned Int liefert einen negativen Wert?
Antwort
sollte diese Arbeit:
unsigned int a;
printf("%u\n", a);
Erläuterung: Auf den meisten Architekturen unterzeichnete ganze Zahlen in two's complement vertreten sind. In diesem System werden positive Zahlen kleiner als 2**(N-1)
(wobei N = sizeof(int)
) auf die gleiche Weise dargestellt, unabhängig davon, ob Sie eine int
oder eine unsigned int
verwenden. Wenn die Zahl in Ihrem unsigned int jedoch größer als 2**(N-1)
ist, stellt es eine negative vorzeichenbehaftete Zahl unter Zweierkomplement dar - was printf
Ihnen gab, als Sie es "%d"
übergeben.
Drucken %d
liest die Ganzzahl als eine vorzeichenbehaftete Dezimalzahl, unabhängig von ihrem definierten Typ.
Um vorzeichenlose Nummern zu drucken, verwenden Sie %u
.
Dies geschieht aufgrund der Möglichkeit von C, Variablenargumente zu verarbeiten. Der Compiler zieht nur Werte aus dem Stack (eingegeben als void*
und zeigt auf den Aufruf-Stack) und printf
muss herausfinden, was die Daten aus der Format-Zeichenfolge enthält, die Sie es geben.
diesem Grund sollten Sie die Formatzeichenfolge liefern müssen - C hat keine Möglichkeit, RTTI oder eine ‚Basisklasse‘ (Object
in Java, zum Beispiel) aus einer generischen oder vordefinierten toString
zu erhalten.
Nitpick: C ist call by value, daher zieht der Compiler Argumentwerte, keine Zeiger. Übergeben Sie keine Zeiger auf Werte (printf ("% u", & myvariable);), übergeben Sie Werte direkt (printf ("% u", myvariable);). – unwind
Es gibt tatsächlich 'printf' einen Zeiger auf den Stapel. – LiraNuna
@LiraNuna - Die Implementierung von varargs Funktionen ist nicht spezifiziert, weshalb weder '#define va_copy (dest, src) dest = src' noch' #define va_copy (dest, src) memcpy (dest, src, sizeof (va_list)) 'ist ein tragbarer Ersatz für das Makro' va_copy' auf Systemen, auf denen es nicht zur Verfügung steht. Einer von ihnen mag arbeiten, aber wer weiß was? –
% d bedeutet printf interpretiert den Wert als int (was mit Vorzeichen versehen ist). Verwenden Sie% u, wenn es ein unsigned int ist.
- 1. MySQL berechnet negativen Wert auf INT UNSIGNED
- 2. C - printf unsigned int
- 3. ein wenig in einen int konvertiert einem negativen Wert zurück
- 4. Java-Zufall liefert auf lange Sicht immer einen negativen Trend?
- 5. unsigned int in unsigned short int mit Bitoperator
- 6. Konst Verweis auf einen gegossenen int von unsigned int
- 7. Convert BIGINT UNSIGNED INT
- 8. Kann ich ein unsigned char * in einen unsigned int * umwandeln?
- 9. Vergleiche unsigned char mit einer negativen Zahl
- 10. in C unter Verwendung unsigned mit negativen temporären Ergebnissen
- 11. unsigned int vs unsigned short Unterschied in C++
- 12. sprintf und unsigned int array in C
- 13. System.Environment.Version liefert einen ungenauen Wert
- 14. zwischen negativen Werten und unsigned ints
- 15. C++: Compiler Warnung für große unsigned int
- 16. Warum (int) ((unsigned int) ((int) v)?
- 17. Ungültige Typen 'int [unsigned int]' für Array-Index C++
- 18. Unsigned Int in Java
- 19. sql server 4 byte unsigned int
- 20. Warum gibt numeric_limits :: min einen negativen Wert für int zurück, aber positive Werte für float/double?
- 21. Unterschied zwischen unsigned short int und unsigned short
- 22. C++ Rekursion liefert keinen erwarteten Wert
- 23. MongoDB "Limit" Operator negativen Wert
- 24. Android signed int zu unsigned Int-Konvertierung
- 25. Printing unsigned long long int Wert Typ Gibt seltsame Ergebnisse
- 26. __NSCFNumber gibt einen negativen Wert zurück
- 27. AWK konvertieren große unsigned int zu signed int (binär)
- 28. C und C++ ungerade Syntax "unsigned int: 32;"
- 29. Drucken unsigned short int in hexadezimal und dezimal C
- 30. Konvertieren von Hexadezimalzeichen in unsigned int Problem C++
Sehen Sie, ob Ihr Compiler eine Option hat, über diese Art von Fehler zu warnen. Es ist -W Format mit gcc. –
Mögliches Duplikat von [Wie kann ich den Maximalwert einer Ganzzahl ohne Vorzeichen drucken?] (Http://stackoverflow.com/questions/12812812/how-can-i-print-maximum-value-of-an-unsigned-integer) –