Saturday 26 August 2017

C Print Char Array As Binary Optionen


Ich folge einem College-Kurs über Betriebssysteme und lernte, wie man von binären zu hexadezimalen, dezimalen bis hexadezimal, etc. konvertiert und heute haben wir gerade gelernt, wie signierte Signaturen im Speicher mit dem Twos-Komplement gespeichert sind (Wir haben ein paar Übungen zu tun Auf Papier und ich möchte in der Lage sein, meine Antworten zu bestätigen, bevor ich meine Arbeit an den Lehrer sende. Ich schrieb ein C-Programm für die ersten Übungen, aber jetzt Im stecken, wie ich meine Antwort mit dem folgenden Problem zu überprüfen: und wir Müssen die Binärdarstellung im Gedächtnis von a. B und c. Ive es auf Papier und es gibt mir die folgenden Ergebnisse (alle binären Darstellungen in Erinnerung an die Zahlen nach dem Doppel-Komplement): a 00111010 (seine a char, So 1 Byte) b 00001000 (es ist ein Char, also 1 Byte) c 11111110 11000101 (es ist ein kurzer, also 2 Bytes) Gibt es eine Möglichkeit, meine Antwort zu bestätigen Gibt es einen Standardweg in C, um die binäre Darstellung in Erinnerung zu zeigen Eine Nummer, oder muss ich jeden Schritt selbst kodieren (berechnen Sie die Twos Komplement und dann in binäre umwandeln) Ich weiß, die letzteren würde nicht so lange, aber Im neugierig, wenn es eine Standard-Weg, um dies zu tun. C Strings (Arrays Vs. Pointers) Vor der String-Klasse wurde die abstrakte Idee eines Strings mit nur einem Array von Zeichen implementiert. Zum Beispiel ist hier ein String: Was dieses Array im Speicher aussieht, ist folgendes: Wo der Anfang des Arrays an einem bestimmten Ort im Computerspeicher ist, zB Standort 1000. Hinweis: Vergiss nicht, dass ein Zeichen zum Speichern benötigt wird Das nul Zeichen (0), das das Ende des Strings angibt. Ein Zeichenarray kann mehr Zeichen haben als die abstrakte Zeichenkette, die in ihm gehalten wird, wie unten: Geben Sie ein Array an, das wie folgt aussieht: (wobei 3 Arrayelemente derzeit nicht verwendet werden). Da diese Streicher wirklich nur Arrays sind, können wir auf jedes Zeichen im Array mit der Subskriptionsnotation zugreifen, wie in: was das dritte Zeichen ausdruckt, n. Ein Nachteil der Erstellung von Strings mit der Zeichen-Array-Syntax ist, dass Sie vor der Zeit sagen müssen, wie viele Zeichen das Array halten kann. Beispielsweise geben wir in den folgenden Array-Definitionen die Anzahl der Zeichen (entweder implizit oder explizit) für das Array zuzuordnen. So müssen Sie die maximale Anzahl von Zeichen angeben, die Sie in einem Array speichern müssen. Diese Art der Arrayzuordnung, bei der die Größe des Arrays zur Kompilierzeit bestimmt wird, wird als statische Zuweisung bezeichnet. Strings als Zeiger: Eine andere Möglichkeit, auf einen zusammenhängenden Teil des Speichers zuzugreifen, anstatt mit einem Array, ist mit einem Zeiger. Da reden wir über Saiten. Die aus Zeichen bestehen. Gut unter Verwendung von Zeigern zu Zeichen. Oder besser, char s. Allerdings halten Zeiger nur eine Adresse, sie können nicht alle Zeichen in einem Zeichen-Array. Dies bedeutet, dass, wenn wir ein Zeichen verwenden, um einen String zu verfolgen, das Zeichenarray, das den String enthält, bereits vorhanden sein muss (entweder statisch oder dynamisch zugewiesen). Unten ist, wie Sie einen Zeichenzeiger verwenden können, um einen String zu verfolgen. Wir hätten so etwas wie das Folgende im Speicher (z. B. annehmen, dass das Array-Label bei der Speicheradresse 2000 gestartet wurde.): Hinweis: Da wir dem Zeiger die Adresse eines Arrays mit Zeichen zugewiesen haben. Der Zeiger muss ein Zeichenzeiger sein - die Typen müssen übereinstimmen. Um auch die Adresse eines Arrays einem Zeiger zuzuordnen, verwenden wir nicht die Adresse des Operators (amp), da sich der Name eines Arrays (wie Label) wie die Adresse dieses Arrays in diesem Zusammenhang verhält. Jetzt können wir labelPtr wie das Array-Namensschild verwenden. So konnten wir auf das dritte Zeichen in der Zeichenfolge zugreifen: Es ist wichtig, sich daran zu erinnern, dass der einzige Grund, warum der Zeiger labelPtr uns erlaubt, auf das Label-Array zuzugreifen, ist, weil wir LabelPtr darauf hingewiesen haben. Angenommen, wir machen folgendes: Jetzt nicht mehr der Zeiger labelPtr beziehen sich auf Label. Aber jetzt zu label2 wie folgt: Also, jetzt, wenn wir mit labelPtr unterzeichnen. Wir beziehen uns auf Zeichen in label2. Folgendes: druckt aus r. Das dritte Zeichen im Label2-Array. So wie wir andere Arten von Arrays an Funktionen weitergeben können, können wir dies mit Strings tun. Unten ist die Definition einer Funktion, die ein Label und einen Aufruf zu dieser Funktion druckt: Da Label ein Zeichen-Array ist und die Funktion PrintLabel () ein Zeichen-Array erwartet, ist das obige sinnvoll. Allerdings, wenn wir einen Zeiger auf das Zeichen-Array-Label haben. Wie in: dann können wir auch den Zeiger auf die Funktion übergeben, wie in: Die Ergebnisse sind die gleichen. Warum Antwort: Wenn wir ein Array als Parameter auf eine Funktion deklarieren, bekommen wir wirklich nur einen Zeiger. Außerdem werden Arrays immer automatisch durch Verweis übergeben (z. B. wird ein Zeiger übergeben). Also konnte PrintLabel () auf zwei Arten geschrieben werden: Es gibt keinen Unterschied, denn in beiden Fällen ist der Parameter wirklich ein Zeiger. Anmerkung: In C gibt es einen Unterschied in der Verwendung von Klammern () bei der Deklaration einer globalen, statischen oder lokalen Array-Variablen gegenüber der Verwendung dieser Array-Notation für den Parameter einer Funktion. Mit einem Parameter zu einer Funktion bekommst du immer einen Zeiger, auch wenn du Array-Notation benutzt. Dies gilt für alle Arten von Arrays. Da man manchmal nicht weiß, wie groß ein String bis zur Laufzeit ist, musst du auf dynamische Zuordnung zurückgreifen Das Folgende ist ein Beispiel für die dynamisch zuordnende Leerzeichen für einen String zur Laufzeit: Grundsätzlich haben wir nur einen neuen (der Zuweisungsoperator) gefragt, um uns genügend Platz für ein Array der gewünschten Größe zu geben. Operator neu erfordert die Art der Elemente (hier, char) und die Anzahl der benötigten Elemente (angegeben als Arraygröße zwischen und). Beachten Sie, dass im Gegensatz zur statischen Zuweisung, z. B. Die Größe kann variabel sein (bei Neuzuordnung für die Zuordnung). Wir verfolgen das dynamisch zugewiesene Array mit einem Zeiger (zB der Rückgabewert des Aufrufs zu neu ist in str gespeichert).Wir können diesen Zeiger verwenden, da wir Zeiger auf statisch zugewiesene Arrays verwendet haben (dh wir gelangen auf einzelne Zeichen Mit stri. Pass die Zeichenfolge zu einer Funktion, etc.). Schließlich ist zu beachten, dass wir, wenn wir mit dem String fertig sind, es freigeben müssen. Hinweis: Beachten Sie die Verwendung von delete, um ein Array freizugeben. Hier delegieren wir die Saite in der gleichen Funktion, aber in manchen Fällen können wir sie noch brauchen, nachdem SomeFunc () endet, also wed es später freizugeben. Denken Sie daran, wir müssen einen Zeiger auf den Anfang der Zeichenfolge zu halten, weil das ist, was verwendet wird, um auf die Zeichenfolge zuzugreifen und zu deallokieren. Arrays vs. Pointers: Wie wir jetzt sehen können, gibt es mehr als einen Weg, um einen String zu sehen. Auf einen String kann in einem statisch zugeteilten Array zugegriffen werden, auf den man über einen Zeiger auf ein statisch zugeteiltes Array oder vielleicht über einen Zeiger auf ein dynamisch zugewiesenes Array zugreifen kann. BU CAS CS - C Strings (Arrays vs. Pointers) Copyright Kopie 1993-2000 von Robert I. Pitts ltrip bei bu dot edugt. Alle Rechte vorbehalten. Es gibt kein binärer Umwandlungsspezifizierer in glibc normalerweise. Es ist möglich, benutzerdefinierte Umwandlungstypen in die Funktion printf () in glibc hinzuzufügen. Weitere Informationen finden Sie unter registerprintffunction. Sie können eine benutzerdefinierte b-Konvertierung für Ihren eigenen Gebrauch hinzufügen, wenn es den Anwendungscode vereinfacht, um ihn verfügbar zu haben. Hier ist ein Beispiel für die Implementierung eines benutzerdefinierten printf-Formats in glibc. Auch was du über w. r.t. Umgang mit mehreren Ergebnissen nacheinander ist nicht reentrancy per se, sondern einfach nur der Fallout der Verwendung, was ein globales Objekt ist, um das Ergebnis zu speichern. Die Funktion wird nicht erneut eingegeben. In C ist das richtige oder zumindest weit verbreitete Idiom für den Umgang mit Funktionen, die ihre Ergebnisse in einem globalen Objekt speichern, diese Ergebnisse sofort nach dem Erhalten zu kopieren. Dies hat den großen Vorteil, dass, wenn nur ein Ergebnis zu einem Zeitpunkt erforderlich ist, keine zusätzliche Zuordnung erforderlich ist. Ndash Greg A. Woods 27. November um 0:51 Hier müssen wir nicht einverstanden sein. Ich kann sehen, wie das Hinzufügen eines unauffälligen Präprozessor-Symbols irgendwo in die Nähe der Schädlichkeit der Begrenzung der Verwendungsfälle schwer wird, wodurch die Schnittstelle fehleranfällig ist, die permanente Speicherung für die Dauer des Programms für einen temporären Wert reserviert und einen schlechteren Code auf den meisten modernen Plattformen erzeugt . Ndash R .. Nov 27 12 at 1:53 Die printf () - Familie ist nur in der Lage, in Basis 8, 10 und 16 mit den Standard-Spezifizierer direkt zu drucken. Schlagen Sie vor, eine Funktion zu erstellen, die die Nummer in einen String pro Codes umwandelt. Alle anderen Antworten haben bisher mindestens eine dieser Einschränkungen. Verwenden Sie den statischen Speicher für den Rückkehrpuffer. Dies begrenzt die Anzahl der Zeiten, die die Funktion als Argument für printf () verwendet werden kann. Weisen Sie Speicher zu, der den Anrufcode benötigt, um Zeiger freizugeben. Benötigen Sie den Anrufcode, um explizit einen geeigneten Puffer bereitzustellen. Ruf printf () direkt an. Dies erfordert eine neue Funktion für fprintf (). Sprintf (). Vsprintf (). Etc. Verwenden Sie eine reduzierte Anzahl von ganzen Zahlen. Das Folgende hat keine der oben genannten Einschränkungen. Es erfordert C99 oder später und Verwendung von s. Es verwendet ein zusammengesetztes Literal, um den Pufferplatz zur Verfügung zu stellen. Es hat keine Probleme mit mehreren Anrufen in einem printf ().

No comments:

Post a Comment