Wie werden Bits im Speicher gespeichert? (In Stücken? Kann es Teile mehrerer Größen geben, die Toghether gespeichert sind?)

StackOverflow https://stackoverflow.com/questions/1546381

Frage

Früher dachte ich, dass jeder Speicherort 8, 16, 32 oder 64 Bit enthält. Also würde 0101 in einer 8 -Bit -Maschine als 00000101 gespeichert (Zeichen erweitert, wenn es negativ wäre). Das war alles in Ordnung und Dandy, bis ich aus Neugier ein Programm in Java schrieb, um mehr innere Arbeiten dieses Systems zu finden.

Die fragliche Methode sieht so aus:

public void printBinaryRep(File f){
        try{
            FileInputStream inputStream = new FileInputStream(f);
            int next = 0;
            byte b = 0;
            while((next = inputStream.read()) != -1){
                b = (byte)next;
                System.out.println((char)next + " : "+Integer.toBinaryString(next));
            }
            inputStream.close();
        }
        catch(Exception e){System.out.println(e);}
 }

Ich habe diese Ausgabe von einer Datei mit der Hello World erhalten

H : 1001000
e : 1100101
l : 1101100
l : 1101100
o : 1101111
  : 100000
W : 1010111
o : 1101111
r : 1110010
l : 1101100
d : 1100100

Das alles sieht bis auf den Raum gut aus. Es hat 6 Bit anstelle von 8. Ich frage mich jetzt, wie all diese Informationen im Gedächtnis gespeichert werden. Wenn alles in 8 -Bit -Brocken aufbewahrt wurde, wie

Hallo: 10010001100101111111011001101111

Dann können Sie sich einfach jeden 8 -Bit -Stück ansehen und herausfinden, auf welche Nummer es darstellt (und dann, auf welchen ASCII -Code es sich bezieht). Wie funktioniert es, wenn ein unterschiedlicher Charakter (wie der 6 -Bit -Raum und der 4 -Bit /n) mit ihnen mitgelagert ist? Dann würde die Aufbewahrung einer kleinen Anzahl in einem großen Bit -Raum nicht viele Teile verschwenden?

Ich denke, ich habe ein gewisses grundlegendes Verständnis falsch (oder vielleicht irgendwo das falsch ...). Entschuldigung, wenn die Frage seltsam oder zu unbedingt ausführlich klingt. Ich will nur wissen. Ich habe etwas gegoogelt, aber es hat sich nichts Relevantes ausgedacht. Wenn Sie mich wissen lassen können, wo ich falsch gelaufen bin, oder mich in die richtige Richtung weisen, würde ich es sehr schätzen. Vielen Dank!

War es hilfreich?

Lösung

Sie werden besser dran sein, in C und/oder in der Montage zu experimentieren als Java. Diese Sprachen sind niedrigere Ebene und enthüllen den Adressraum direkt.

Früher dachte ich, dass jeder Speicherort 8, 16, 32 oder 64 Bit enthält. Also würde 0101 in einer 8 -Bit -Maschine als 00000101 gespeichert (Zeichen erweitert, wenn es negativ wäre). Das war alles in Ordnung und Dandy, bis ich aus Neugier ein Programm in Java schrieb, um mehr innere Arbeiten dieses Systems zu finden.

Alle Speicherorte in X86 -Systemen enthalten 8 Bit (1 Byte). Wenn ein Wert mehr Daten enthält, als in ein einzelnes Byte passen kann, wird er unter Verwendung mehrerer Bytes gespeichert. In C wird beispielsweise der "Float" -Typ unter Verwendung von 4 Bytes (32 Bit) gespeichert.

Das alles sieht bis auf den Raum gut aus. Es hat 6 Bit anstelle von 8. Ich frage mich jetzt, wie all diese Informationen im Gedächtnis gespeichert werden. Wenn alles in 8 -Bit -Brocken aufbewahrt wurde, wie

Der Raum wird auch in einem einzigen Byte gespeichert. Ihr Druckcode vergisst, auf 8 Leerzeichen zu padeln. 100000 == 00100000 == 0x20.

Andere Tipps

Der Raum hat auch 8 Bit. Es ist nur diese Ganzzahl. Tobinarystring druckt keine Führung nicht 0 Bits so wie du es benutzt hast.

Mit all den führenden 0 Bits, es sieht tatsächlich in Erinnerung an:

H : 01001000
e : 01100101
l : 01101100
l : 01101100
o : 01101111
  : 00100000
W : 01010111
o : 01101111
r : 01110010
l : 01101100
d : 01100100

Ihre ursprüngliche Intuition war (meistens) richtig: Alle Speicherorte bestehen aus der gleichen Anzahl von Bits. Auf allen modernen Maschinen gibt es acht Teile in einem "Byte", in denen ein Byte das kleinste Speicherblock ist, auf den die Maschine einzeln zugreifen kann.

Schauen Sie sich Ihre Ausgabe genau an. Du hast Sieben Ziffern in allen außer dem Raum. Der Raum beginnt einfach mit zwei Nullen in seiner binären Darstellung, während die anderen Buchstaben mit einem beginnen.

Eigentlich ist Ihr Ansatz falsch. Codierung ist hier sehr wichtig.

Wenn Sie ASCII verwenden, können Sie leicht sagen, dass jedes Zeichen in einem Byte (acht Bits) gespeichert ist, aber wenn Änderungen Codierung kodieren, können Sie das nicht sagen.

EG: UTF-8 verwendet ein bis drei Bytes (8 bis 24 Bit) für jedes Zeichen auf einer Zeichenfolge. Aus diesem Grund sehen Sie eine Überladung, bei der Sie die Codierung des InputStream -Objekts angeben können.

Durch die Auswahl eines falschen Eingabestreams wird absolut eine falsche Zeichenfolge ausgegeben. Daher müssen Sie die Codierung der Datei kennen, um zu verstehen, welches Bit was bedeutet. Tatsächlich macht FileInputStream dies für Sie.

Wenn Sie eine Ziffer als Zeichenfolge speichern, dauert sie eine Zeichenlänge auf der Festplatte. Genau wie ein anderer Charakter.

Wenn Sie jedoch 123456789 als Zeichenfolge mit ASCII -Codierung speichern, dauert es 9*8 Bit = 72 Bit.

Wenn Sie dies als Ganzzahl speichern (beachten Sie, dass die Datenbreite von Integer in verschiedenen Umgebungen unterscheidet) dauert nur 16 Bit.

Das können Sie auch nicht sicher sein

H : 01001000
e : 01100101
l : 01101100
l : 01101100
o : 01101111
  : 00100000
W : 01010111
o : 01101111
r : 01110010
l : 01101100
d : 01100100
\n: 00001010

wird in Festplatte als H: 01001000 E gelagert.

Sie können sich dessen nicht sicher sein. Dateisystem ist nicht so einfach. Vielleicht ist Hello aufeinanderfolgend, aber die Weltschnur steht am Ende des Drive. Deshalb gibt es den Befehl des Defragers.

Wenn wir jedoch über das Hauptspeicher (RAM) sprechen, wenn Sie eine Zeichenfolge definieren, erwarte ich, dass Bits aufeinanderfolgend sind. Zumindest in C ist es. Sie definieren eine solche Zeichenfolge.

char[100] value; // c is a char array. (there is no string type in c)

Hier ist Wert [0] das erste Zeichen unserer Zeichenfolge. Und Wert adressiert nur an den Speicherort der Char -Arrays im Speicher.

Wenn die Adresse von Wert [0] 10 beträgt, beträgt die Adresse von Wert [1] 10+8 = 18.

Die Art und Weise, wie Computernummern mit einem Kilometerzähler in einem Auto verglichen werden können. Wenn der Kilometerzähler 4 Ziffern hat, wird die Nummer 33 als "0033" gespeichert.

Wenn jemand fragt Sie, was Ihre Kilometerleistung ist, Sie werden nicht sagen "null Tausend null hundertunddreißig". Standardmäßig nicht. (Obwohl Sie es sagen können.)

Dann würde die Aufbewahrung einer kleinen Anzahl in einem großen Bit -Raum nicht viele Teile verschwenden?

Nicht wirklich. Angenommen, Sie hatten irgendwo 11000100 in Erinnerung. Wie soll der Computer wissen, ob dies 11000100 oder 11000 bedeutet, gefolgt von 100 oder 1 gefolgt von 1000, gefolgt von 100 usw.?

Nun, der Computer folgt gerade dem Programm, das er gegeben wird (denken Sie daran, dass ein Java -Programm teilweise von Ihnen und teilweise von den Personen erstellt wird, die Java entwerfen). Wenn Sie ein praktikables System zum Speichern von Bits erstellen können, können Sie den Computer dies tun.

Beachten Sie jedoch, dass es einen Kompromiss in Bezug auf die Verbrauchsnutzung und die Programmierschwierigkeit gibt. Da kann ein typischer Computer mit Bytes arbeiten viel schneller als mitspielsweise 7-Bit- oder Variable-Bit-Zahlen, ist das Speichern von ASCII-Codes in Bytes eine sehr häufige Wahl für die Aufbewahrung von Text.

Aber lassen Sie mich zu Ihrer Frage zurückkehren.

Dann würde die Aufbewahrung einer kleinen Anzahl in einem großen Bit -Raum nicht viele Teile verschwenden?

Mathematisch gesehen nein. Ein Zweig der Mathematik genannt Informationstheorie sagt uns, dass die Anzahl der unbedingt notwendigen Bits von den Möglichkeiten abhängt, die Sie codieren möchten und wie wahrscheinlich jeder von ihnen ist.

Nehmen wir an, Sie haben nur ein Vierbuchstaben-Alphabet (A, B, C, D) und verwenden zwei Bit-Zahlen (00, 01, 10, 11), um es darzustellen. Wenn jede dieser Buchstaben gleich wahrscheinlich ist, beträgt die Mindestzahl der erforderlichen Bits pro Buchstabe (im Durchschnitt) 2. Mit anderen Worten, es gibt es nein Verschwendete Bits, obwohl a 00 und B 01 ist.

Andererseits, wenn Sie ASCII verwenden und A, B, C, D als folgende 7-Bit-Zahlen codieren:

A: 1000001
B: 1000010
C: 1000011
D: 1000100

Dann "verschwenden" Sie 5 Bit pro Buchstaben (obwohl Sie nicht "kleine Zahlen in einem großen Bitraum speichern").

Diese Art von Überlegungen sind wichtig bei der Gestaltung von Komprimierungsalgorithmen und nicht so wichtig für Tagesanwendungen. Es ist sicherlich wichtig, Teile und Bytes zu verstehen, wenn Sie C. lernen möchten.

Laut dem Java 4 API,

Der unsignierte Ganzzahlwert ist das Argument plus 232, wenn das Argument negativ ist. Ansonsten ist es gleich dem Argument. Dieser Wert wird in eine Zeichenfolge von ASCII -Ziffern in Binärer (Basis 2) ohne zusätzliche Niveau umgewandelt.

In Wirklichkeit ist die Datenspeicherung tatsächlich viel komplizierter. Für die Effizienz in der Verarbeitung werden die meisten Datentypen bei Wortgrälen gespeichert, dh 4 Bytes auf 32-Bit-Maschinen oder 8 Bytes auf 64-Bit-Maschinen. Arrays können genauer gepackt werden, damit das char [4] kann den gleichen "tatsächlichen Raum" verwenden wie char.

Java ist eine virtuelle Maschine, und ich bin mir nicht sicher, welche Speicherarchitektur sie verwendet.

Das klärt es auf. Mein Hauptproblem war, dass ich am Anfang die Nullen übersah. Ich habe damit experimentiert, als ich mehr über Komprimierungsalgorithmen (nämlich gzip) las Ich habe ASCII für all dies angenommen. Es war nicht das Ziel des Programms, die Darstellung zu sehen, sondern die unterschiedliche Anzahl von Bits pro Wort warf mich vom ursprünglichen Ziel der Implementierung einer grundlegenden, indexbasierten Komprimierung für einen Dateityp ab, an dem ich arbeite. Ich werde versuchen, es in C neu zu schreiben, sobald ich einen Proof of Concept in Java habe.

Vielen Dank!

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/integer.html#tobinarystring%28int%29
Die Spezifikation von Integer.

"Dieser Wert wird in eine Reihe von ASCII -Ziffern in Binärer (Basis 2) ohne zusätzliche führende 0s umgewandelt."

Dass Sie diese Tatsache übersehen haben, hat zu Ihrer Verwirrung geführt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top