Les chaînes ASCII et endianness

D'un stagiaire qui travaille avec moi m'a montré un examen qu'il avait pris en informatique à propos de l'endianness questions. Il y avait une question qui a montré une chaîne de caractères ASCII "Mon-Pizza", et l'élève avait à montrer comment cette chaîne serait représenté en mémoire sur un little endian ordinateur. Bien sûr, cela sonne comme une question piège, car les chaînes ASCII ne sont pas affectés par endian questions.

Mais étonnamment, le stagiaire affirme que son professeur insiste sur le fait que la chaîne serait représenté comme:

P-yM azzi

Je sais que cela peut ne pas être juste. Il n'existe aucun moyen d'une chaîne de caractères ASCII qui serait représenté comme ça sur n'importe quelle machine. Mais apparemment, le professeur insiste sur ce point. Alors, j'ai écrit un petit programme en C et a dit à la stagiaire de le donner à son professeur.

#include <string.h>
#include <stdio.h>

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

Cela démontre clairement que la chaîne est stockée comme "Ma-Pizza" dans la mémoire. Un jour plus tard, le stagiaire obtient de nouveau à moi et me dit le professeur prétend maintenant que C est automatiquement convertir les adresses pour afficher la chaîne de caractères dans le bon ordre.

Je lui ai dit que son professeur est fou, et c'est clairement faux. Mais juste pour ma propre santé mentale ici, j'ai décidé de poster ceci sur stackoverflow pour que je puisse obtenir d'autres pour confirmer ce que je dis.

Donc, je pose la question : qui est là?

  • Avez-vous accès à un débogueur pour montrer au prof? Est-ce que linux ou windows?
  • Assurez-vous. La même chose pourrait être démontrée à l'aide de gdb sur linux, en examinant chaque octet dans la mémoire
  • Pas besoin d'un débogueur: le cas des OP (bien joué) utilisation de la %p spécificateur de format vous indique tous vous avez vraiment besoin de savoir.
  • Bien que strlen() dans un for() boucle conditionnelle me fait grincer des dents.
  • SÉRIEUSEMENT? Qui est ce gars? (et +1 pour Chris).
  • M. Lutz -- Conscient de l' %p j'ai senti qu'il ne sera pas assez pour le professeur en question. Après tout, le professeur se sent déjà que l'opérateur ++ n'quelque chose d'intelligent avec char * de "jump around", il pourrait aussi bien aussi une sorte de renuméroter lui-même lorsqu'il est passé à printf(). Un débogueur est un autre de mise en oeuvre et indépendant de la langue, j'ai pensé qu'il pourrait éduquer le prof. 😉
  • Vérifier l'assembleur & écrire votre propre routine assembleur. Aussi...j'espère ne jamais rencontrer le prof.
  • Je ne pense pas que vous voudriez nom de ce professeur.
  • Bien qu'il n'est pas question, dans cette question, j'ai enlevé le strlen appel de la boucle, de sorte que moins de gens écrire comme ça quand venir pour une entrevue.
  • Peut-être que je suis en train de faire le prof trop de crédit, mais le fait que le "humanisé de sortie de l'explication" n'a pas eu lieu à quiconque me fait penser que SI a vraiment bâclé la réponse à celui-ci...
  • Je pense que vous êtes à côté de la question; ce professeur de réclamations, pour quelque raison que endianness questions (qui, par définition, n'affectent types de plus de 8 bits) affectent de données de 8 bits. Pouvez-vous expliquer ce que vous pensez qu'il essaie de dire?
  • J'ai juste donné un exemple dans ma réponse. Bien sûr, je ne peux pas lire le prof de l'esprit, mais le fait que cette autre explication n'a même pas les gens, c'est .. un sujet de préoccupation.
  • Une autre explication est que le prof et la foule sont "pas tout faire". Si le prof est mauvais, il doit avoir au moins eu à vous les gars pourquoi il pourrait avoir été mal. Je pense toujours que c'est juste une question de la représentation. Je suppose que nous aurions interview du prof pour savoir à coup sûr.
  • $ cat > /tmp/Ma pizza-Pizza$ $ od-X /tmp/pizza 0000000 502d794d 617a7a69 0000010 $ Pour l'enregistrement, y == 79, M == 4d. Faire le point?
  • Ouais je vois que dans votre réponse ci-dessous, mais je ne vois pas comment vous pouvez obtenir cette interprétation de la question. Il semble assez clair pour moi ce qu'il se passe. Si le prof a eu tort et nettoyé jusqu'au lieu d'essayer de perpétuer, avec son jour le plus tard réponse, je pense que ce serait une autre histoire.
  • vous êtes l'amalgame entre la façon dont la chaîne peut être représenté dans un certain format, par rapport à comment il est stocké en mémoire, ce qui est le problème ici. Par votre logique, une traduction en espagnol de la chaîne serait également valable "représentation", parce que c'est une façon pour une application particulière peut "interpréter" la chaîne.