Je pensais que chaque emplacement de mémoire contient 8, 16, 32 ou 64 bits. Donc, 0101 serait stocké dans une machine 8 bits comme 00000101 (signer étendu si elle était négative). Tout allait bien et dandy jusqu'à ce que je puisse écrire un programme à Java par curiosité pour connaître un autre fonctionnement intérieur de ce système.
La méthode en question ressemble à ceci: p> J'ai reçu cette sortie dans un fichier qui dit bonjour monde p> Bonjour: 10010001100101110110011011001101111 P> Ensuite, vous pouvez simplement regarder chaque morceau de 8 bits et comprendre quel numéro il représente (puis quoi Code ASCII, il fait référence à).
Comment fonctionne-t-il lorsqu'un caractère de taille différent (comme l'espace 6 bits et le 4 bit / n) est stocké avec eux ?? Ensuite, ne stockerait pas un petit nombre dans un grand espace gaspillant beaucoup de bits? P> Je pense avoir une partie de la compréhension fondamentale erronée (ou peut-être le problème du programme quelque part ...). Désolé si la question semble étrange ou trop non nécessairement approfondie. Je veux juste savoir. J'ai fait des googles, mais cela n'a pas été rendu avec quoi que ce soit de pertinence. Si vous pouvez me faire savoir où je me suis mal passé ou me dirigerai dans la bonne direction, je l'apprécierais grandement.
Merci! P> p>
8 Réponses :
Selon le Java 4 API , P>
La valeur integer 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 indirect supplémentaire 0s. P> blockQuote>
En réalité, le stockage des données est en fait beaucoup plus compliqué. Pour les gains d'efficacité dans le traitement, la plupart des types de données sont stockés sur des bornes de mots, ce qui signifie 4 octets sur des machines 32 bits ou 8 octets sur des machines 64 bits. Les matrices peuvent être emballées de plus près, de sorte que
Char [4] code> peut finir par utiliser la même quantité d'espace "réel" comme
char code>. P>
Java est une machine virtuelle, et je ne suis pas certain de quelle architecture de mémoire, le cas échéant, elle utilise. p>
L'espace a également 8 bits. C'est juste cet integer.tobarinaringstring n'imprime pas le dirigeant avec tous les bits code> 0 code>, il ressemble en fait à ceci en mémoire : p> 0 code> BITS comme vous l'avez utilisé.
Vous serez mieux d'expérimenter en C et / ou l'assemblage, plutôt que Java. Ces langues sont de niveau inférieur et exposent directement l'espace d'adresses. P>
Je pensais que chaque mémoire L'emplacement contient 8, 16, 32 ou 64 morceaux. Donc 0101 serait stocké dans un 8 Machine de bits 00000101 (signer étendu Si c'était négatif). Tout allait tout va bien et dandy jusqu'à ce que j'ai écrit un programme dans Java par curiosité pour en savoir plus plus de fonctionnement intérieur de ce système. P> blockQuote>
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 possible dans un seul octet, il est stocké à l'aide de plusieurs octets. Par exemple, en C, le type "flotteur" est stocké à l'aide de 4 octets (32 bits). P>
Tout cela a l'air bien sauf pour le espace. Il a 6 bits au lieu de 8. Je suis me demandant maintenant comment tout ça Les informations sont stockées en mémoire. Si Tout cela a été stocké dans des morceaux de 8 morceaux, comme p> blockQuote>
L'espace est également stocké dans un seul octet. Votre code d'impression n'oublie pas de passer à 8 espaces. 100000 == 00100000 == 0x20. P>
Je suis complètement d'accord avec l'approche C / ASM.
Merci John, ça a plus de sens! J'apprends C, mais j'ai toujours tendance à coder pour m'amuser à Java depuis que je suis plus à l'aise avec elle.
La plupart des ordinateurs modernes ont 8 bits par emplacement de mémoire. Dans les vieux jours, j'ai travaillé sur des systèmes avec 60 bits (supercalculateurs CDC) et il y avait des systèmes avec 1 (Burroughs).
Votre intuition d'origine était (principalement) correcte: tous les emplacements de mémoire sont constitués 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. P>
Regardez de près votre sortie. Vous avez
FAIT FUN: Certains DSP modernes (comme certains ordinateurs plus anciens) ont uniquement une mémoire adressable de mots. C'est-à-dire une adresse des avancées plus élevées de 16 ou 32 bits. Sur une architecture adressable par mot, un octet est toujours de 8 bits (à moins que nous ne parlions de systèmes antiques avec par exemple par exemple 36 bits), mais vous ne pouvez pas charger / stocker une individuellement individuellement. (Vous devez charger le mot contenant et / ou pour remplacer un octet, puis le stocker en arrière.) Un avantage à la mémoire adressable Word est qu'un pointeur 16 bits peut adresser des temps de taille de mots 2 ^ 16 octets de mémoire, au lieu de 2 ^ 16. (Donc deux fois plus nombreux ou 4x que beaucoup de bits.)
En fait, votre approche est fausse. Le codage 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 changements, vous ne pouvez pas dire cela. P>
Choix du mauvais flux d'entrée provoquera absolument une sortie de chaîne incorrecte. Ainsi, vous devez connaître le codage du fichier pour comprendre quel bit signifie quoi. En fait, FileInputStream fait cela pour vous. P>
Si vous stockez un chiffre en tant que chaîne, il faudra une longueur de charrette dans le disque dur. Juste comme un autre caractère. P>
Toutefois, si vous stockez 123456789 en tant que chaîne avec l'encodage ASCII, il faudra 9 * 8 bits = 72 bits. P>
Si vous stockez cela comme entier, (Notez que La largeur de données d'entier diffère dans différents environnements) il ne prendra que 16 bits. p>
Aussi vous ne pouvez pas être sûr que P>
char[100] value; // c is a char array. (there is no string type in c)
Si vous parlez de fragmentation des données physiques dans un fichier logique, vous pouvez également envisager que la valeur de caractère [100] code> peut s'étendre sur une limite de page virtuelle et être divisé sur 2 pages physiques. Et / ou un contrôleur de mémoire multi-canaux peut interlire des pages DRAM ou des lignes de cache entre les canaux DRAM, de sorte que toutes les autres lignes de cache de 64 octets pourraient être distinctes sur une dimm physique. Mais le matériel gère la cartographie de la mémoire, contrairement aux pilotes du système de fichiers logiciels. Néanmoins, ni ne sont pertinents pour un programme qui lit les fichiers; Un système de fichiers est un niveau d'indirection qui présente des fichiers logiquement contigus
La manière dont les numéros de stockage des ordinateurs peuvent être comparés à un compteur kilométrique dans une voiture. Si l'odomètre comporte 4 chiffres, il stocke le numéro 33 comme "0033".
Si quelqu'un vous demande em> vous ce que votre kilométrage est, vous n'allez pas dire "zéro mille zéro cent cent trente Trois". Par défaut, Java n'est pas non plus. (Bien que vous puissiez le dire.) P> Alors ne stockerait pas un petit nombre dans un grand espace d'espace perdu beaucoup de bits? P>
blockQuote>
blockquote> Eh bien, pas vraiment. Supposons que vous ayez 11000100 en mémoire quelque part. Comment l'ordinateur est-il censé savoir si cela signifie que cela signifie 11000100, ou 11000 suivi de 100, ou 1 suivi de 1000 suivi de 100, et ainsi de suite? P> Eh bien, l'ordinateur est en réalité suivant le programme qu'il est Donné (rappelez-vous qu'un programme Java est créé en partie par vous et partiellement par les personnes qui conçoivent Java). Si vous pouvez créer un système viable pour sauver des bits, vous pouvez le faire. P> Cependant, gardez à l'esprit qu'il y a un compromis en termes d'utilisation du processeur et de difficulté de programmation. Étant donné qu'un ordinateur typique peut fonctionner avec des octets beaucoup plus rapidement que ce qu'il peut avec dire, des nombres de bits 7 bits ou variables, stocker des codes ASCII en octets est un choix très courant pour stocker du texte. P > mais laissez-moi revenir à votre question. p> Alors ne stockerait pas un petit nombre dans un grand espace d'espace perdu beaucoup de bits? P>
blockQuote>
BlockQuote> Parler mathématiquement, non. Une branche de mathématiques appelées Théorie de l'information nous dit que le nombre de bits absolument nécessaires dépend de Les possibilités que vous souhaitez coder et quelle est la probabilité que chacune d'entre elles est. P> Supposons que vous n'ayez qu'une alphabet de quatre lettres (A, B, C, D) et utilisez 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 NO EM> Les bits gaspillés, même si A est 00 et B est 01 . P> D'autre part, si vous utilisez ASCII et codez A, B, C, D en tant que numéros 7 bits suivants: P>
A: 1000001
B: 1000010
C: 1000011
D: 1000100
qui l'effache. Mon problème principal était que je donnais sur les zéros au début. J'écessais avec cela comme je lisais plus sur les algorithmes de compression (nommément GZIP) J'avais supposé ASCII pour tout cela. Voir la représentation n'était pas l'objectif du programme, mais le nombre de bits différents par mot m'a jeté de l'objectif initial de mettre en œuvre une compression basée sur l'index de base pour un type de fichier que je travaille. Je vais essayer de le réécrire en C une fois que j'ai une preuve de concept en Java. p>
Merci! P>
http: //docs.oracle.com/javase/1.5.0/docs/aprium/java/lang/integer.html#tobinyString%28int%29
La spécification d'Integer.Tobinys lit:
P>
"Cette valeur est convertie en une chaîne de chiffres ASCII en binaire (base 2) sans avantage supplémentaire 0s " em> p> blockQuote>
que vous avez négligé ce fait est ce qui a conduit à votre confusion. P>
Désolé, une erreur de Newbie (je suis nouveau pour empiler débordement. C'était ma première question)
Notez que les autres personnages ont seulement 7 bits ;-).