C++: Comment puis-je jeter un int à un unsigned long et de ne pas changer tous les bits?

C++: Comment puis-je jeter un int à un unsigned long et de ne pas changer tous les bits?
Je veux emballer et déballer des valeurs dans la mémoire. Le mot de la taille est de 64 bits.

Cet extrait illustre bien le problème:

int v1 = -2; //0xfe
unsigned long v2=(unsigned long)v1; //0xfffe, I want 0x00fe

La solution est simple:

unsigned long v2=(unsigned int)v1; //0x00fe

Toutefois, ce code est dans un modèle où le type de cible est un paramètre, j'ai donc dû recourir à cette:

uint64 target = mem[index] & mask;
uint64 v;
if (value < 0) {
    switch (bits) {
    case 8:
        v = (uint8)value;
        break;
    case 16:
        v = (uint16)value;
        break;
    case 32:
        v = (uint32)value;
        break;
    }
} else {
    v = value;
}
v = v << lShift;
target |= v;
mem[index] = target;

Supposons, par exemple, le type de "valeur" est un int (16 bits) et les bits=16.
Le but est de masquer les bits dans la mémoire de valeur et de les remplacer.

Quelqu'un sait-il un moyen plus facile?

Vous avez une taille de mot de 64 bits et int 16? C'est spécial.
Qu'est-ce que la signature de la méthode? Vous ne donner que des informations partielles ainsi seulement s'attendre à une partie de la bonne solution. Mais je soupçonne que vous pouvez utiliser boost::type_traits pour vous aider.
La façon dont vous le faites n'est pas portable. Si vous souhaitez conserver les bits de façon portable, vous avez besoin de recourir à type de beaucoup les jeux de mots: unsigned long v2= *(unsigned int*)&v1;. Sinon vous avez un conversion de valeur, qui est autorisé à modifier des bits en fonction du signe de la représentation.

OriginalL'auteur Michael Fitzpatrick | 2011-08-05