258 votes

C++ - Comment à imprimer (à l’aide de cout) la façon dont un certain nombre est stockée en mémoire ?

Je suis en suivant un cours de niveau collégial sur les systèmes d'exploitation et nous apprenons comment faire pour passer du binaire à l'hexadécimal, décimal en hexadécimal, etc. et aujourd'hui, nous venons d'apprendre comment signed/unsigned numéros sont stockés dans la mémoire en utilisant le complément à deux (~+1).

Nous avons un couple d'exercices à faire sur papier et je voudrais être en mesure de vérifier mes réponses avant de soumettre mon travail à l'enseignant. J'ai écrit un programme en C++ pour les premiers exercices, mais maintenant je suis bloqué, comment j'ai pu vérifier ma réponse avec le problème suivant:

char a, b;

short c;
a = -58;
c = -315;

b = a >> 3;

et nous avons besoin de montrer la représentation binaire dans la mémoire de l' a, b et c.

Je l'ai fait sur papier, et il me donne les résultats suivants (toutes les représentations binaires dans la mémoire des numéros après le complément à deux):

a = 00111010 (c'est un char, donc 1 octet)

b = 00001000 (c'est un char, donc 1 octet)

c = 11111110 11000101 (c'est un court, donc 2 octets)

Est-il un moyen de vérifier ma réponse? Est-il un moyen standard en C++ pour montrer la représentation binaire en mémoire d'un numéro, ou dois-je code à chaque étape de moi-même (calculer le complément à deux et ensuite de les convertir en binaire)? Je sais que ce dernier ne serait pas si long, mais je suis curieux de savoir si il existe un moyen standard pour le faire.

Merci pour votre aide (je ne pouvais pas trouver une question avec un sujet similaire avec les mots-clés je sais donc je suis désolé si ce n'est une sorte de double emploi).

Aussi, je ne savais pas vraiment lequel des balises pour choisir de se sentir libre de les modifier en conséquence.

495voto

Jerry Coffin Points 237758

Le moyen le plus simple est probablement de créer une `` qui représente la valeur, puis diffuser qu’à `` .

128voto

r233967 Points 161

Std::bitset permet d’effectuer un cast. Aucune des variables temporaires, pas de boucles, aucune fonction, aucune macro.

26voto

Cubbi Points 25339

Si vous souhaitez afficher les bits de la représentation de tout objet, non seulement d'un nombre entier, n'oubliez pas de réinterpréter comme un tableau de char d'abord, puis vous pouvez imprimer le contenu de ce tableau, que hex, ou même que les binaires (via bitset):

#include <iostream>
#include <bitset>
#include <climits>

template<typename T>
void show_binrep(const T& a)
{
    const char* beg = reinterpret_cast<const char*>(&a);
    const char* end = beg + sizeof(a);
    while(beg != end)
        std::cout << std::bitset<CHAR_BIT>(*beg++) << ' ';
    std::cout << '\n';
}
int main()
{
    char a, b;
    short c;
    a = -58;
    c = -315;
    b = a >> 3;
    show_binrep(a);
    show_binrep(b);
    show_binrep(c);
    float f = 3.14;
    show_binrep(f);
}

Notez que les systèmes les plus courants sont little-endian, de sorte que la sortie de l' show_binrep(c) est pas le 1111111 011000101 que vous attendez, parce que ce n'est pas comment il est stocké dans la mémoire. Si vous êtes à la recherche pour la valeur de la représentation en binaire, puis un simple cout << bitset<16>(c) travaux.

13voto

sbi Points 100828
<blockquote> <p>Y a-t-il un moyen standard en C++ pour afficher la représentation binaire à la mémoire d’un certain nombre [...] ?</p> <p>N ° Il n’y a aucune <code></code> , comme <code></code> ou <code></code> , mais ce n’est pas difficile d’un nombre binaire de sortie vous-même :</p><p>Vous exportez le bit le plus à gauche en masquant tous les autres, décalage vers la gauche et répéter que, pour tous les bits vous avez.</p><p>(Le nombre de bits dans un type est <code></code> .)</p></blockquote>

6voto

eudoxos Points 4072

Semblable à ce qui est déjà affiché, juste à l’aide de décalage de bits et masque pour obtenir le bit ; utilisable pour n’importe quel type, qui est un modèle (seulement ne sais pas si il existe un moyen standard pour obtenir le nombre de bits à 1 octet, j’ai utilisé 8 ici).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X