Un stagiaire qui travaille avec moi m'a montré un examen qu'il avait passé en informatique sur les problèmes d'endianness. Il y avait une question qui montrait une chaîne ASCII "My-Pizza", et l'étudiant devait montrer comment cette chaîne serait représentée en mémoire sur un ordinateur en little endian. Bien sûr, cela ressemble à une question piège car les chaînes ASCII ne sont pas affectées par les problèmes d'endianness.
Mais choquant, le stagiaire affirme que son professeur insiste sur le fait que la chaîne serait représentée comme suit :
P-yM azzi
Je sais que ça ne peut pas être correct. Il n'y a aucune manière qu'une chaîne ASCII soit représentée de cette manière sur une machine. Mais apparemment, le professeur insiste là-dessus. Alors, j'ai rédigé un petit programme en C et j'ai dit au stagiaire de le donner à son professeur.
#include
#include
int main()
{
const char* s = "My-Pizza";
size_t length = strlen(s);
for (const char* it = s; it < s + length; ++it) {
printf("%p : %c\n", it, *it);
}
}
Ceci démontre clairement que la chaîne est stockée comme "My-Pizza" en mémoire. Un jour plus tard, le stagiaire revient vers moi et me dit que le professeur prétend maintenant que le C convertit automatiquement les adresses pour afficher la chaîne dans le bon ordre.
Je lui ai dit que son professeur est fou, et que c'est clairement faux. Mais juste pour vérifier ma propre santé mentale, j'ai décidé de poster ceci sur stackoverflow pour que d'autres confirment ce que je dis.
Donc, je demande : qui a raison ici ?
0 votes
Avez-vous accès à un débogueur pour montrer au professeur? Est-ce Linux ou Windows?
0 votes
Bien sûr. La même chose pourrait être démontrée en utilisant gdb sur Linux, en examinant chaque octet en mémoire
4 votes
Pas besoin d'un débogueur : l'utilisation bien jouée de l'OP du spécificateur de format
%p
vous dit tout ce que vous avez vraiment besoin de savoir.14 votes
Même si
strlen()
dans une condition de bouclefor()
me donne des frissons.0 votes
SÉRIEUSEMENT? Qui est ce gars? (et +1 pour Chris).
0 votes
Mr. Lutz -- Conscient du %p, j'ai senti que cela ne serait pas suffisant pour le professeur en question. Après tout, le professeur pense déjà que l'opérateur ++ fait quelque chose d'astucieux avec char * pour "sauter", il pourrait tout aussi bien se renuméroter de lui-même lorsqu'il est passé à printf(). Un débogueur étant une autre implémentation et sans langage spécifique, j'ai pensé que cela pourrait éduquer le prof. ;)
0 votes
Vérifiez l'assembleur & écrire votre propre routine d'assembleur. Also...J'espère ne jamais rencontrer ce prof.
2 votes
Je ne pense pas que vous aimeriez nommer ce professeur.
3 votes
Bien que cela n'ait pas d'importance dans cette question, j'ai retiré l'appel à strlen de la boucle afin qu'un nombre moins important de personnes écrivent de cette manière lorsqu'elles viennent à un entretien.
0 votes
Peut-être que je donne trop de crédit au prof, mais le fait que l'explication de la "sortie humanisée" n'ait pas été pensée par personne me fait penser que SO a vraiment gâché la réponse à celle-ci...
0 votes
@Ross, Je pense que tu ne comprends pas le point; ce professeur affirme pour une raison quelconque que les problèmes de boutisme (qui, par définition, n'affectent que les types plus grands que 8 bits) affectent les données sur 8 bits. Peux-tu expliquer ce que tu penses qu'il essaie de dire?
0 votes
Je viens de donner un exemple dans ma réponse. Bien sûr, je ne peux pas lire dans l'esprit du professeur, mais le fait que cette explication alternative n'ait même pas été envisagée par les gens est.. une préoccupation.
0 votes
Une autre explication est que le professeur et le groupe d'opérations spéciales ne "comprennent pas tout à fait". Si le professeur a tort, cela aurait dû au moins vous venir à l'esprit pourquoi il aurait pu avoir tort. Je pense toujours que c'est juste une question de représentation. Je suppose que nous devrions interviewer le professeur pour en avoir le cœur net.
0 votes
$ cat > /tmp/pizza My-Pizza$ $ od -X /tmp/pizza 0000000 502d794d 617a7a69 0000010 $ Pour l'enregistrement, y == 79, M == 4d. Comprends-tu?
0 votes
Oui, je vois cela dans votre réponse ci-dessous, mais je ne vois pas comment vous pouvez obtenir cette interprétation de la question. Il me semble assez clair ce qui se passe. Si le prof avait tort et l'avait clarifié au lieu d'essayer de le perpétuer avec sa réponse un jour plus tard, je pense que ce serait une autre histoire.
5 votes
@Ross, vous confondez comment la chaîne peut être représentée dans un certain format, par rapport à la façon dont elle est réellement stockée en mémoire, ce qui est le problème ici. Selon votre logique, une traduction en espagnol de la chaîne serait également une "représentation" valide car c'est une façon dont une application particulière peut "interpréter" la chaîne.