Comment les bits stockés dans la mémoire? (En gros morceaux? Peut-il y avoir des morceaux de plusieurs tailles stockées ensemble?)

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

Question

I habitude de penser que chaque emplacement de mémoire contient 8, 16, 32 ou 64 bits. Donc 0101 serait stocké dans une machine 8 bits comme 00000101 (signe prolongé si elle était négative). Ce fut bien beau jusqu'à ce que j'écrit un programme en java par curiosité pour découvrir des mécanismes plus internes de ce système.

La méthode en question ressemble à ceci:

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

Je suis cette sortie d'un fichier qui dit Bonjour tout le monde

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

Tout cela semble bien à l'exception de l'espace. Il dispose de 6 bits au lieu de huit. Je demande maintenant comment toutes ces informations sont stockées dans la mémoire. Si tout cela a été stocké en 8 morceaux de bits, comme

Bonjour: 10010001100101110110011011001101111

Ensuite, vous pouvez simplement regarder à chaque 8 morceau de bits et comprendre ce nombre, il est représentant (et quel code ASCII, il fait référence à). Comment fonctionne-t-il quand est stocké avec eux un caractère de taille différente (comme le 6 espace bits et 4 bits / n) ?? Ensuite, ne serait pas le stockage d'un petit nombre dans un grand espace de peu perdre beaucoup de bits?

Je crois avoir une partie de la compréhension fondamentale mal (ou peut-être la faute du programme quelque part ...). Désolé si la question semble étrange ou trop non nécessairement en profondeur. Je veux juste savoir. Je l'ai fait quelques googler, mais ne suis pas venu avec quoi que ce soit relevent. Si vous pouvez me faire savoir où je suis allé mal ou me diriger dans la bonne direction, je l'apprécie grandement. Merci!

Était-ce utile?

La solution

Vous serez mieux expérimenter en C et / ou de montage, plutôt que Java. Ces langues sont de niveau inférieur et exposent l'espace d'adressage directement.

  

Je pensais que chaque mémoire   emplacement contient 8, 16, 32 ou 64   morceaux. Donc 0101 serait stocké dans un 8   Machine de bits comme 00000101 (signe prolongé   si elle était négative). Tout cela était bien   et dandy jusqu'à ce que je l'ai écrit un programme   java par curiosité pour découvrir quelques-uns   plusieurs mécanismes internes du système.

Tous les emplacements de mémoire dans les systèmes x86 contiennent 8 bits (1 octet). Si une valeur contient plus de données que peut tenir dans un seul octet, il est stocké à l'aide de plusieurs octets. Par exemple, dans C, du type "float" est stocké à l'aide de 4 octets (32 bits).

  

Tout cela semble bien à l'exception du   espace. Il dispose de 6 bits au lieu de 8. Je suis   maintenant se demander comment tout cela   les informations sont stockées dans la mémoire. Si   tout cela a été stocké en 8 morceaux de bits,   comme

L'espace est également stocké dans un seul octet. Votre code d'impression est d'oublier de tampon sur 8 espaces. == == 100000 00100000 0x20.

Autres conseils

L'espace a 8 bits aussi. Il est juste que Integer.toBinaryString n'imprime pas bits de tête 0 la façon dont vous l'avez utilisé.

Avec tous les bits de tête 0, il semble en fait comme ceci en mémoire:

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

Votre intuition d'origine était (la plupart du temps) correcte: tous les emplacements de mémoire se composent du même nombre de bits. Sur toutes les machines modernes, il y a huit bits dans un « octet », où un octet est le plus petit morceau de mémoire que la machine peut accéder individuellement.

Regardez attentivement votre sortie. Vous avez sept chiffres dans tous les pays sauf l'espace. L'espace se produit juste pour commencer par deux zéros dans sa représentation binaire, tandis que les autres lettres commencent par un.

En fait, votre approche est erronée. L'encodage est très important ici.

Si vous utilisez ASCII, vous pouvez facilement dire que chaque caractère est stocké dans un octet (huit bits), mais lors de l'encodage des modifications vous ne pouvez pas dire que.

Exemples: UTF-8 utilise un à trois octets (de 8 à 24 bits) pour chaque caractère d'une chaîne. C'est la raison pour laquelle vous verrez une surcharge dans laquelle vous pouvez spécifier l'encodage sur l'objet InputStream.

Le choix flux d'entrée mal sera absolument provoquer une mauvaise sortie de chaîne. Ainsi, vous devez connaître l'encodage du fichier à comprendre quel bit signifie quoi. En fait FileInputStream le fait pour vous.

Si vous stockez un chiffre sous forme de chaîne, il faudra une longueur char dans le disque dur. Tout comme un autre caractère.

Toutefois, si vous stockez 123.456.789 sous forme de chaîne avec ASCII encodant prendra 9 * 8 bits = 72 bits.

Si vous stockez cela comme entier, (notez la largeur de données de cet entier diffère dans des environnements différents), il ne vous prendra que 16 bits.

Aussi, vous ne pouvez pas être sûr que

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

est stocké dans le disque dur en tant que H: 01001000 e: 01100101 l: 01101100 l: 01101100 o: 01101111   : 00100000 W: 01010111 o: 01101111 r: 01110010 l: 01101100 d: 01100100 \ N: 00001010

Vous ne pouvez pas être sûr. Système de fichiers n'est pas aussi simple que cela. Peut-être Bonjour est successive, mais la chaîne mondiale est à la fin de l'entraînement. C'est pourquoi il y a commande defrag.

Mais si l'on parle de la mémoire principale (RAM) lorsque vous définissez une chaîne i attends bits à successifs. Au moins en C, il est. Vous définissez une chaîne comme ça.

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

ici la valeur [0] est le premier caractère de notre chaîne. Et la valeur adresse uniquement aux réseaux de type char emplacement en mémoire.

si la valeur [0] 'l'adresse est 10 alors la valeur [1]' est l'adresse de 10 + 8 = 18.

Les numéros façon stockent les ordinateurs peuvent être comparés à un compteur kilométrique dans une voiture. Si le compteur kilométrique a 4 chiffres, il stocke le numéro 33 comme « 0033 ».

Si quelqu'un demande vous ce que votre kilométrage est, tu ne vas pas dire « zéro mille zéro cent trente-trois ». Par défaut, Java ne pas non plus. (Bien que vous puissiez dire à.)

  
    

Alors ne stockant un petit nombre dans un grand espace de peu perdre beaucoup de bits?

  

Eh bien, pas vraiment. Supposons que vous ayez 11000100 en mémoire quelque part. Comment l'ordinateur censé savoir si cela signifie 11000100, ou suivi de 100 11000 ou 1 suivi de 1000 suivie par 100, et ainsi de suite?

Eh bien, en fait l'ordinateur ne fait que suivre le programme, il est donné (rappelez-vous qu'un programme Java est créé en partie par vous et en partie par les gens qui conçoivent Java). Si vous pouvez créer un système viable pour les bits d'économie, vous pouvez faire l'ordinateur le faire.

Cependant, gardez à l'esprit qu'il ya un compromis entre en termes d'utilisation du processeur et de la difficulté de programmation. Depuis un ordinateur typique peut travailler avec des octets beaucoup plus rapidement qu'il peut avec par exemple, 7 bits ou bits variables, le stockage des codes ASCII en octets est un choix très commun pour stocker du texte.

Mais permettez-moi de revenir à votre question.

  
    

Alors ne stockant un petit nombre dans un grand espace de peu perdre beaucoup de bits?

  

Mathématiquement parlant, non. Une branche des mathématiques appelée nous Théorie de l'information indique que le nombre de bits qui sont absolument nécessaires dépend les possibilités que vous souhaitez encoder et la probabilité chacun d'eux est.

Supposons que vous avez seulement un alphabet de quatre lettres (A, B, C, D), et utiliser des nombres à deux bits (00, 01, 10, 11 respectivement) pour le représenter. Si chacune de ces lettres est également probable, le nombre minimum de bits requis par lettre (en moyenne) est 2. En d'autres termes, il y a pas Mèches gaspillées même si une est 00 et B est 01 .

Par contre, si vous utilisez ASCII et encode A, B, C, D comme les numéros 7 bits suivants:

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

alors vous « perdre » 5 bits par lettre (même si vous n'êtes pas « stocker de petits nombres dans un grand espace de bits »).

Ces sortes de considérations sont importantes lors de la conception des algorithmes de compression, et pas si important pour everday applications. Il est certainement important de comprendre les bits et octets si vous souhaitez apprendre C.

D'après le Java 4 API ,

  

La valeur entière non signée est l'argument, plus 232 si l'argument est négatif; autrement   il est égal à l'argument. Cette valeur est convertie en une chaîne de chiffres ASCII en binaire   (Base 2) sans leaders supplémentaires 0s.

En réalité, le stockage de données est en réalité beaucoup plus complexe. Pour l'efficacité dans le traitement, la plupart des types de données sont stockées à des limites de mots, ce qui signifie 4 octets sur des machines 32 bits, soit 8 octets sur des machines 64 bits. Les tableaux peuvent être plus étroitement emballés, de sorte que char [4] peut finir par utiliser la même quantité de « espace réel » comme char.

Java est une machine virtuelle, et je ne suis pas certain de ce que l'architecture mémoire, le cas échéant, il utilise.

qui efface le haut. Mon problème principal était que je méconnais les zéros au début. Je faisais des expériences avec ce que je lisais plus sur des algorithmes de compression (à savoir, gzip) Je supposais ASCII pour tout cela. En voyant la représentation n'a pas été l'objectif du programme, mais un nombre différent de bits par mot m'a jeté hors de l'objectif initial de la mise en œuvre d'une compression, basée sur un indice de base pour un type de fichier je travaille. Je vais essayer de le réécrire en C une fois que j'ai une preuve de concept en Java.

Merci!

http: //docs.oracle.com/javase/1.5.0/docs/api/java/lang/Integer.html#toBinaryString%28int%29
la spécification de Integer.ToBinarys lit comme suit:

  

"Cette valeur est convertie en une chaîne de chiffres ASCII en binaire (base 2)   sans grands supplémentaires 0 "

Que vous négligé ce fait est ce qui a conduit à votre confusion.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top