Falsches Ergebnis für% p bei Implementierung printf

8

Ich arbeite an meinem eigenen Code printf und ich habe 2 Probleme, von denen ich hoffe, dass Sie mir helfen könnten.

Der erste ist mit der Option %p :

Diese Option gibt mir die Zeigeradresse eines void* in Hex-Form an. Also was ich mache ist das:

%Vor%

wobei dectohex nur eine Funktion ist, die ein decimal in hex konvertiert. Das Ergebnis wird immer korrekt sein, außer für die letzten 3 Zeichen. Immer. Zum Beispiel:

%Vor%

Und diese Zeichen ändern sich nicht sehr oft, während sich der andere Teil bei jedem Aufruf ändert, wie es sein soll.

Das andere Problem, das ich habe, ist mit der Option %O . Ich kann es nicht schaffen, ein signiertes int in ein unsigned int zu konvertieren. printf gibt riesige Zahlen für negative int's aus, und keine Umwandlung scheint zu funktionieren, da ich sowieso keine Speicherstelle hätte.

BEARBEITEN: Vielen Dank für die Antworten, also anscheinend für das erste Problem war ich nur ein bisschen dumm. Für die zweite Frage werde ich die verschiedenen Lösungen, die du mir gegeben hast, ausprobieren und dich aktualisieren, wenn es mir gelingt.

Nochmals vielen Dank für Ihre Zeit und Geduld, und Entschuldigung für die Verzögerung in meiner Antwort, ich habe die E-Mail-Benachrichtigung für eine Antwort überprüft, aber es funktioniert offenbar nicht.

REEDIT: Nachdem Sie Ihre Antworten auf meine zweite Frage genauer gelesen haben, denke ich, dass einige von Ihnen denken, dass ich nach% o oder% 0 gefragt habe. Ich habe wirklich von% O gesprochen, wie in% Lo denke ich. Im Mann sagt es mir "% O: Das lange int Argument wird in vorzeichenloses oktal umgewandelt". Mein Problem ist, bevor ich den langen int in oktal umwandle, muss ich ihn in etwas ohne Vorzeichen konvertieren.

    
madraven 16.12.2014, 13:02
quelle

4 Antworten

3

Wenn uintptr_t/intmax_t definiert ist (optional), wandeln Sie den Zeiger in diesen Integer-Typ um und drucken Sie dann.

Andernfalls, wenn sizeof(uintmax_t) >= sizeof (void *) , in uintmax_t konvertieren. uintmax_t ist ein erforderlicher Typ, aber möglicherweise nicht groß genug.

%Vor%

Das Problem %O ist wahrscheinlich ein Zeichenerweiterungsproblem. (@mafso) Versichern Sie, dass die verwendeten Wertgegenstände unsigniert sind, wie unsigned und unsigned long . Ohne den Code zu sehen, ist es schwer sicher zu wissen.

    
chux 16.12.2014, 16:25
quelle
2

Über das erste Problem, das Sie haben, um sicherzustellen, dass Sie die Adresse der Sache (beachten Sie, dass Ding selbst ist ein Zeiger) oder die Adresse der origin der Sache (der Zeiger auf den Zeiger Ding)?

Sie drucken gerade den Zeiger auf den Zeiger.

Ändern

%Vor%

bis

%Vor%

wenn das der Fall ist.

Über das %O Problem, können Sie ein Codebeispiel geben?

    
Ishay Peled 16.12.2014 13:07
quelle
1

Du brauchst "unsigned long long" für deine Besetzung.

Zeiger sind unsigniert, aber lang ist signiert.

Die Anzahl der Bits in jedem Datentyp ist implementierungsabhängig; heutzutage ist es üblich, dass lang und vorzeichenlos lang 32 Bit sind.

edit: Um klarer zu sein, man kann sich nicht auf die Anzahl der Bits in C, C ++ oder Objective-C verlassen, es ist immer implementierungsabhängig. Zum Beispiel war es zu einer Zeit üblich, neun Bit-Bytes und sechsunddreißig Bit-Wörter zu haben. Aus diesem Grund geben die Internetprotokolle immer "Oktette" - Gruppen von acht Bits - statt "Bytes" an.

Das ist ein Vorteil von Java, da die Anzahl der Bits in jedem Datentyp genau festgelegt ist.

    
Mike Crawford 16.12.2014 13:05
quelle
0

Über Ihre zweite Frage bezüglich Zero-Padding und negativer Ganzzahlen, die völlig unabhängig von der ersten Frage über die Hexadezimalausgabe erscheint. Sie können negative Zahlen wie diese behandeln (obwohl sie in 32-Bit nicht mit dem Wert -2147483648 funktionieren, der 0x80000000 ist).

%Vor%     
Weather Vane 16.12.2014 14:15
quelle

Tags und Links