¿Cómo se almacenan los bits en la memoria?(¿En trozos?¿Pueden haber bits de varios tamaños almacenados juntos?)

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

Pregunta

Solía ​​​​pensar que cada ubicación de memoria contiene 8, 16, 32 o 64 bits.Entonces 0101 se almacenaría en una máquina de 8 bits como 00000101 (signo extendido si fuera negativo).Todo esto estaba muy bien hasta que escribí un programa en Java por curiosidad de descubrir más funcionamiento interno de este sistema.

El método en cuestión se ve así:

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);}
 }

Obtuve este resultado de un archivo que dice Hola mundo.

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

Todo se ve bien excepto el espacio.Tiene 6 bits en lugar de 8.Ahora me pregunto cómo se almacena toda esa información en la memoria.Si todo estuviera almacenado en fragmentos de 8 bits, como

Hola:10010001100101110110011011001101111

Luego, simplemente puede mirar cada fragmento de 8 bits y descubrir qué número representa (y luego a qué código ASCII se refiere).¿Cómo funciona cuando se almacena junto con ellos un carácter de diferente tamaño (como el espacio de 6 bits y el /n de 4 bits)?Entonces, ¿almacenar un número pequeño en un espacio de bits grande no desperdiciaría muchos bits?

Creo que tengo algunos conceptos básicos incorrectos (o tal vez el programa esté equivocado en alguna parte...).Lo siento si la pregunta suena extraña o demasiado innecesariamente profunda.Sólo quiero saber.Busqué un poco en Google, pero no encontré nada relevante.Si puede decirme dónde me equivoqué o indicarme la dirección correcta, se lo agradecería mucho.¡Gracias!

¿Fue útil?

Solución

Se va a estar mejor experimentar en C y / o montaje, en lugar de Java. Esas lenguas son de nivel inferior y exponen al espacio de direcciones directamente.

  

Yo solía pensar que cada memoria   ubicación contiene 8, 16, 32 o 64   Bits. Así que 0101 podría ser almacenado en un 8   máquina poco como 00000101 (signo extendido   si era negativo). Esto fue todo bien   y dandy hasta que escribí un programa en   java por curiosidad para saber algunos   más funcionamiento interno de este sistema.

Todas las ubicaciones de memoria en sistemas x86 contienen 8 bits (1 byte). Si un valor contiene más datos de los que caben en un solo byte, se almacena el uso de múltiples bytes. Por ejemplo, en C, el tipo de "flotación" se almacena por medio de 4 bytes (32 bits).

  

Todo se ve bien, excepto por la   espacio. Cuenta con 6 bits en lugar de 8. Estoy   Ahora se pregunta cómo todo eso   la información se almacena en la memoria. Si   todo ello se almacenó en trozos de 8 bits,   como

El espacio también se almacena en un solo byte. Su código de impresión está olvidando de disolución de 8 espacios. 100000 == == 0x20 00100000.

Otros consejos

El espacio tiene 8 bits también. Es sólo que no se imprime Integer.toBinaryString principales bits de 0 la forma en que lo utilizó.

Con todos los bits iniciales 0, lo que realmente se ve así en la memoria:

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

Su intuición original (la mayoría) correcta: todas las ubicaciones de memoria consisten en el mismo número de bits. En todas las máquinas modernas, hay ocho bits en un "byte", donde un byte es el trozo más pequeño de la memoria que la máquina pueda acceder de forma individual.

Mira de cerca a su salida. Tiene siete dígitos en todos ellos, excepto el espacio. El espacio sólo pasa a comenzar con dos ceros en su representación binaria, mientras que las otras letras comienzan con uno.

En realidad, su enfoque es erróneo. La codificación es muy importante aquí.

Si utiliza ASCII entonces se puede decir fácilmente que cada carácter se almacena en un byte (ocho bits), pero cuando se codifica cambios que no se puede decir eso.

Ej: UTF-8 utiliza una a tres bytes (8 a 24 bits) para cada carácter en una cadena. Es por eso que verá una sobrecarga en el que se puede especificar la codificación en el objeto InputStream.

La elección de la corriente de entrada incorrecta causará absolutamente una salida de cadena mal. Por lo tanto usted tiene que saber la codificación del archivo para comprender lo que significa poco qué. En realidad FileInputStream lo hace por usted.

Si almacena un dígito como cadena que tomará una longitud de carbonización en el disco duro. Al igual que otro personaje.

Sin embargo, si usted almacena 123456789 como cadena con codificación ASCII que tomará 9 * 8 bits = 72 bits.

Si usted guarda como entero, (tenga en cuenta la anchura de datos de número entero que varía en diferentes entornos) que no nos llevará 16 bits.

También no se puede estar seguro de que

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

se almacena en el disco duro como H: 01001000 e: 01100101 l: 01101100 l: 01101100 o: 01101111   : 00100000 W: 01010111 o: 01101111 r: 01110010 l: 01101100 d: 01100100 \ N: 00001010

No se puede estar seguro de eso. Sistema de archivos no es tan simple. Tal Hola es sucesiva, pero la cadena mundial se encuentra al final de la unidad. Es por eso que no hay comando de desfragmentación.

Pero si hablamos de la memoria principal (RAM) cuando se define una cadena que espero bits a sucesivas. Al menos en C que es. Se define una cadena como esa.

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

aquí el valor [0] es el primer carácter de nuestra cadena. Y el valor sólo se refiere a la ubicación de las matrices de carbonilla en la memoria.

si el valor de [0] 's dirección es 10 entonces el valor [1]' s dirección es 10 + 8 = 18.

La forma en que las computadoras almacenan los números se puede comparar con el odómetro de un automóvil.Si el cuentakilómetros tiene 4 dígitos, almacena el número 33 como "0033".

Si alguien pregunta Si sabes cuál es tu kilometraje, no dirás "cero mil cero ciento treinta y tres".Por defecto, Java tampoco lo hace.(Aunque puedes decírselo).

Entonces, ¿almacenar un número pequeño en un espacio de bits grande no desperdiciaría muchos bits?

Bueno en realidad no.Supongamos que tiene 11000100 en la memoria en alguna parte.¿Cómo se supone que la computadora sepa si esto significa 11000100, o 11000 seguido de 100, o 1 seguido de 1000 seguido de 100, etc.?

Bueno, en realidad la computadora simplemente sigue el programa que se le proporciona (recuerde que un programa Java lo crea en parte usted y en parte las personas que diseñan Java).Si puedes crear un sistema viable para guardar bits, puedes hacer que la computadora lo haga.

Sin embargo, tenga en cuenta que existe una compensación en términos de uso del procesador y dificultad de programación.Dado que una computadora típica puede trabajar con bytes mucho más rápidamente que con números de 7 bits o de bits variables, por ejemplo, almacenar códigos ASCII en bytes es una opción muy común para almacenar texto.

Pero déjame volver a tu pregunta.

Entonces, ¿almacenar un número pequeño en un espacio de bits grande no desperdiciaría muchos bits?

Matemáticamente hablando, no.Una rama de las matemáticas llamada Teoría de la información nos dice que la cantidad de bits que son absolutamente necesarios depende de las posibilidades que quieras codificar y de la probabilidad de cada una de ellas.

Supongamos que tiene solo un alfabeto de cuatro letras (A, B, C, D) y usa números de dos bits (00, 01, 10, 11 respectivamente) para representarlo.Si cada una de estas letras es igualmente probable, entonces el número mínimo de bits requeridos por letra (en promedio) es 2.En otras palabras, hay No bits desperdiciados a pesar de que A es 00 y B es 01.

Por otro lado, si usa ASCII y codifica A, B, C, D como los siguientes números de 7 bits:

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

entonces estás "desperdiciando" 5 bits por letra (aunque no estés "almacenando números pequeños en un espacio de bits grande").

Este tipo de consideraciones son importantes al diseñar algoritmos de compresión, y no tanto para las aplicaciones cotidianas.Sin duda, es importante comprender los bits y bytes si deseas aprender C.

De acuerdo con la Java API 4 ,

  

El valor entero sin signo es el argumento más 232 si el argumento es negativo; de otra manera   es igual al argumento. Este valor se convierte en una cadena de dígitos ASCII en binario   (Base 2) sin 0s principales adicionales.

En realidad, el almacenamiento de datos es en realidad mucho más complicado. Para eficiencias en el procesamiento, la mayoría de los tipos de datos se almacenan en el Word-límites, lo que significa de 4 bytes en máquinas de 32 bits, u 8 bytes en máquinas de 64 bits. Las matrices pueden envasarse más de cerca, de modo que char [4] pueden terminar usando la misma cantidad de "espacio real" como char.

Java es una máquina virtual, y no estoy seguro de lo que la arquitectura de memoria, si las hubiere, que utiliza.

Eso lo aclara. Mi principal problema era que yo estaba pasando por alto los ceros en el principio. Estaba experimentando con esto, ya que estaba leyendo más sobre los algoritmos de compresión (es decir, gzip) Yo estaba asumiendo ASCII para todo esto. Al ver la representación no era el objetivo del programa, pero el diferente número de bits por palabra me tiró fuera de la meta original de la aplicación de una compresión básica, basada índice para un tipo de archivo que estoy trabajando. Voy a tratar de volver a escribir en C una vez que tengo una prueba de concepto en Java.

Gracias!

http: //docs.oracle.com/javase/1.5.0/docs/api/java/lang/Integer.html#toBinaryString%28int%29
la especificación de Integer.ToBinarys lee:

  

"Este valor se convierte en una cadena de dígitos ASCII en binario (base 2)   sin 0s principales adicionales "

Eso le pasa por alto este hecho es lo que llevó a la confusión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top