Umwandlung von int in Binär-string zu int mit 2 ergänzen
Es ist ein Binär-string 10001110
was ich weiß, ist mit 2 ergänzen. Ich weiß, es werden 8 bits.
Es ist mir in der form eines unsigned int
entspricht 142.
Ich dann umwandeln müssen, diese zurück zu 10001110
dann umkehren aller bits und addieren einer wodurch es entsprechend 01110010
und dann konvertieren Sie diese zu einem signed int
entspricht -114.
Wie kann ich dies tun? Ich bin relativ neu in C und habe Ewigkeiten versucht, um es herauszufinden!
Im wesentlichen will ich eine Funktion schreiben, die den unsigned int
142 und gibt den signed int
-114
- Und es werden immer 8 bit? Oder was?
- Ja, in diesem Fall weiß ich, dass es 8 bits. Ich möchte in der Lage sein, um übergeben Sie diese als parameter an die Funktion.
- Nicht 01110010 nur 114 (nicht -114)?
- 1) zu konvertieren
unsigned char
, 2) Verwendung der bitweisen Verknüpfung mit "nicht", 3) konvertierenint
. - vergessen Sie "hinzufügen" 😉
- ja 01110010 ist 114 aber die tatsächliche Zahl, die gespeichert wurde, wird -114, weil es war 2 ' s Kompliment
- Das ist nicht klar: 142 ist eigentlich -114. Wenn Sie invertieren die bits und fügen Sie Sie bekommen 114. So würde die Funktion take 142 und zurück 114, nicht -114. Wenn diese falsch ist, dann müssen Sie klären Ihre Frage.
- FYI: es sind zwei die sich ergänzen, nicht Kompliment (keine 2 immer ein Kompliment mich auf etwas 🙁 ).
- Nur damit Sie wissen, wenn
value
ist definitiv 8-bits in Größe, mit und ohne Vorzeichen, dannint x = (((int)value + 128) & 0xff) - 128;
. Es gibt schnellere Möglichkeiten, als auch, kann ich mir vorstellen...so wie die Subtraktion von 256, wenn Wert >= 128. - Ja, sehr -- danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nachdenken über das, was Sie tun können mit dem bitweisen Operatoren. Sie können testen, ob ein bit 1 oder 0 wie diese:
Können Sie auch die Verschiebung der bits in einem int wie diese:
Zu testen, das i ' te bit in einem int können Sie dies tun:
Also anhand dieser Informationen, die Sie umwandeln könnten die gegebene Ganzzahl in Binär-und Informationsspeicher, in ein char-array(wird es in umgekehrter Reihenfolge bereits, wenn Sie count up!) dann manipulieren der char nach Ihren wünschen. Ich hoffe, dies ist ein groß genug Hinweis, um Sie auf Ihre Füße und begann.
~
können invertiert alle bits in einem Rutsch.Brauchen Sie nicht zu ändern, die bit-Muster. Sie müssen nur anmelden, verlängern entsprechend die bit-Länge des unterzeichneten int Ergebnis. Einfachste Weg dies zu tun ist zu überprüfen, das Vorzeichen-bit der Eingabe und anschließend oder mit -1 gesiebt Links durch die bit-Länge, wenn es stellen.
Erklärung
In 8-bit two ' s complelement der bit-Muster für ein unsigned 142 und eine signierte -114 identisch sind. Also, wenn Ihr integer-Datentyp ist 8 bits, die Sie gerade haben, zu konvertieren, geben. Allerdings, wenn Sie haben, sagen wir, 32-bit-Ganzzahlen, aber Sie wollen, Sie zu behandeln, als ob Sie 8-bit-Zweierkomplement, dann muss man die linke-hand 24 bit auf 1, wenn das Vorzeichenbit 1 ist.
128 & -1 == 128
, wenn wir davon ausgehen, Zweierkomplement. Wenn wir das nicht tun, dann $GOTTHEIT weiß, was Sie bekommen.x &= -1
nicht ändernx
überhaupt. Vielleicht meintest du 'x ^= -1`?value | (-1 << bitLength)
int
das gleiche wiesigned int
?int
ist in der Regel die gleichen wiesigned int
.signed int
mit der Zahl tatsächlich im Speicher gespeichert (wahrscheinlich 2-Komplement). Ich muss nur sicher sein, dass die binäre Zeichenfolge mit derunsigned int
ich bin da behandelt wird wie ein string, der wurde codiert, wenn das das richtige Wort ist, mit 2 ergänzen.Können Sie nicht einfach abziehen, 256, von was auch immer Wert, den Sie gegeben?
int func(unsigned int value) { return (unsigned char)(-value); }
würde auch die Arbeit machen.Dude - warum schließen Sie Ihre ursprüngliche Frage????
Meine Antwort ist die gleiche wie die erste:
Ein integer ist eine Ganzzahl. Ob es "signed" oder "unsigned"; ob es sich "zu ergänzen" oder "zweier-Komplement" - bits sind immer die gleichen.
Wenn Sie auf "konvertieren" ein Wert mit Vorzeichen in eine unsigned-Wert, ein C-cast ist in der Regel die beste, einfachste, effizienteste und sauberste Ansatz (code-Beispiel unten).
Die große Mehrheit der CPU-Architekturen sind zweit ergänzen
Wenn, aus welchem Grund auch immer, Sie möchten überprüfen, ob Ihre CPU-Architektur ist zu ergänzen, dann nur test für
-0 == +0
. Zweier-Komplement nicht haben eine "negative zero" (genau null). Zu ergänzen hat.PS:
A:
Dies ist genau das gleiche wie ich vorgeschlagen, in meiner Antwort auf Ihre original-Beitrag.
Hier ist die Lösung, die ich schließlich kam mit.
Danke für die Hilfe an alle!
printf("%i\n", (signed int) unsignedInt);
es gibt mir den falschen nicht :/