2011-04-26 7 views
2

J'ai une int [2] représentation d'un int long dans une machine 32 bits et que vous voulez convertir en long sur machine 64 bits. Y a-t-il une manière sûre d'architecture sûre de faire cette conversion?convertir int [2] en long

La machine source est 32 bits et un int est 32 bits. La machine de destination est 64bit et le type long long est définitivement 64bits.

Puis-je effectuer les opérations suivantes?

long i; 
int j[2]; 
#ifdef LITTLEENDIAN 
j[1] = *(int*)(&i); 
j[0] = *(((int*)(&i))+1) 
#else 
j[0] = *(int*)(&i); 
j[1] = *(((int*)(&i))+1) 
#endif 

Si ce qui précède est incorrect, alors quelle est la meilleure et la plus sûre pour cela? Je suis sûr que cela aurait été demandé précédemment, mais je n'ai pas trouvé de réponse claire.

Merci

+2

Cela dépend ce que vous entendez par "une représentation' int [2] '' d'une longue int'". Comment avez-vous créé cette représentation? –

+1

Endianness n'est pas le seul problème: sizeof (int) peut juste égaler sizeof (long) pour un compilateur particulier sur une machine particulière. Dans ce cas, votre code ne devrait rien faire. –

+0

Par exemple sur Windows 64 bits, 'long' est 32 bits. –

Répondre

4

J'ai un int [2] représentation d'un long int dans une machine 32 bits et que vous voulez convertir en temps sur la machine 64 bits. Y a-t-il une manière sûre d'architecture sûre de faire cette conversion?

Pas vraiment. Parce que, en dehors de l'endianness, les tailles des deux types de données peuvent également varier. Sur certaines plates-formes populaires, int et long ont la même taille (les deux 32 bits)

En fin de compte, cela dépend de la façon dont vous avez créé votre représentation int[2]. Tout ce que vous avez fait pour créer ce tableau int doit être inversé afin d'en obtenir un long valide.

Une approche qui fonctionnera dans la pratique (mais, techniquement parlant, un comportement non défini), est de placer à la fois dans une union:

union { 
    int i2[2]; 
    long l; 
} u; 

Maintenant, vous pouvez simplement écrire u.i2 et lire u.l. Le standard C++ ne le permet pas techniquement (c'est un comportement indéfini), mais c'est un truc si courant que les compilateurs majeurs le supportent de toute façon.

Cependant, une meilleure approche pourrait être d'utiliser un char[] au lieu de int[], parce que char « s sont explicitement autorisés à alias d'autres types.

+0

Merci, cela fonctionne pour moi. La raison pour laquelle je ne peux pas utiliser int64 directement est due au fait que l'entrée provient d'une tierce partie et que je n'ai aucun contrôle sur elle. – Kiran

1

Si vous êtes sûr d'avoir des nombres entiers 32 bits et 64 bits, vous pouvez utiliser le concept union.

union Convert 
{ 
    long i; 
    int j[2]; 
};