2010-06-07 20 views
0

C'est ce que je reçois pour me dorloter avec des langages de programmation de haut niveau.Vous manipulez l'adresse d'une variable pour stocker un type plus petit?


I ont une fonction qui écrit une valeur de 32 bits dans une mémoire tampon, et un uint64_t sur la pile. Le code suivant est-il un bon moyen de le stocker?

uint64_t size = 0; 
// ... 
getBytes((uint32_t*)&size+0x1); 

Je suppose que ce serait le style canonique, coffre-fort:

uint64_t size = 0; 
// ... 
uint32_t smallSize; 
getBytes(&smallSize); 
size = smallSize; 
+0

Y a-t-il une raison pour laquelle vous utilisez un 'uint64_t' sur la pile au lieu d'un type 32 bits? –

+0

@Justin Ethier, oui. Il existe des chemins de code pour deux environnements différents. L'un génère une valeur de 32 bits, l'autre génère une valeur de 64 bits. L'utilisation d'une variable 64 bits permet aux chemins de revenir ensemble. – s4y

+0

Le deuxième exemple est en effet la bonne façon de le faire. – caf

Répondre

3

Non, il fonctionne correctement que sur les machines big-endian. Et supposer un ordre d'octets particulier - sans même le vérifier en premier - n'est pas sain d'esprit.

Même si vous êtes sûr que votre programme s'exécute uniquement sur des machines big-endian, vous ne saurez jamais s'il devra éventuellement fonctionner sur une machine little-endian. (Je l'écris sur un ordinateur fabriqué par une société qui utilise des processeurs big-endian depuis des décennies, puis est passé à des processeurs little-endian il y a quelques années, et qui a maintenant beaucoup de succès avec des processeurs bi-endian dans certains appareils;))

+0

Heh, je suis en train d'écrire ce code pour les machines de cette compagnie - et heureusement - assez c'est sur un chemin de code qui est seulement pris sur la variété big-endian. Je vais prendre le conseil, cependant. – s4y

0

Pourquoi ne pas faire getBytes() pour retourner uint64_t? Et utilisez l'argument (par exemple int *) pour renvoyer le code d'erreur le cas échéant. D'après mon expérience personnelle, si vous voulez vraiment unifier les deux chemins de code, utilisez uint64_t dans les deux. Notez également que "(uint32_t *) & size" rompt les règles strictes d'aliasing C99 (et par exemple dans GCC, il faudrait désactiver l'optimisation).

+0

Merci, mais 'getBytes' est un espace réservé pour une fonction de bibliothèque qui n'est pas sous mon contrôle. – s4y