2010-03-15 8 views
3

Je suis nouveau bits de décalage, mais je suis en train de déboguer le code suivant:C++ Bits décalage

if (!(strcmp(arr[i].GetValType(), "f64"))) 
{ 
     dem_content_buff[BytFldPos] = tmp_data; 
    dem_content_buff[BytFldPos + 1] = tmp_data >> 8; 
    dem_content_buff[BytFldPos + 2] = tmp_data >> 16; 
    dem_content_buff[BytFldPos + 3] = tmp_data >> 24; 
    dem_content_buff[BytFldPos + 4] = tmp_data >> 32; 
    dem_content_buff[BytFldPos + 5] = tmp_data >> 40; 
    dem_content_buff[BytFldPos + 6] = tmp_data >> 48; 
    dem_content_buff[BytFldPos + 7] = tmp_data >> 56; 
     }  

Je reçois un avertissement disant que les lignes avec ont un compte de décalage « 32 » à « 56 » c'est trop grand. Le "f64" dans le prédicat signifie simplement que les données doivent être des données 64 bits.

Comment cela devrait-il être fait?

modifier.

Je aurais dû mettre plus du code dans

tmp_data = simulated_data[index_data]; 

if (!(strcmp(dems[i].GetValType(), "s32"))) 

{ dem_content_buff [BytFldPos] = tmp_data; dem_content_buff [BytFldPos + 1] = tmp_data >> 8; dem_content_buff [BytFldPos + 2] = tmp_data >> 16; dem_content_buff [BytFldPos + 3] = tmp_data >> 24;
}

if ((strcmp (MNE [i] .GetValType(), "F64"))!) { dem_content_buff [BytFldPos] = tmp_data; dem_content_buff [BytFldPos + 1] = tmp_data >> 8; dem_content_buff [BytFldPos + 2] = tmp_data >> 16; dem_content_buff [BytFldPos + 3] = tmp_data >> 24; dem_content_buff [BytFldPos + 4] = tmp_data >> 32; dem_content_buff [BytFldPos + 5] = tmp_data >> 40; dem_content_buff [BytFldPos + 6] = tmp_data >> 48; Dem_content_buff [BytFldPos + 7] = tmp_data >> 56; }

Donc, maintenant, dem_content_buff ne contient que des entiers. Est-ce que je ne peux pas utiliser ce tableau pour les données 64 bits?

+3

De quel type est 'tmp_data'? Vous voudrez probablement que ce soit un type 64 bits. –

Répondre

1

Assurez-vous d'utiliser un type 64 bits pour le tmp_data comme cela a été suggéré avant que le long unsinged ne fonctionne, mais vérifiez la documentation de votre compilateur et de votre architecture.

Le code devrait ressembler à ceci. Assurez-vous également que votre fichier demp_content_buff est déclaré non signé char * ou non signé [].

Ensuite, changez votre code:

if (!(strcmp(arr[i].GetValType(), "f64"))) 
    { 
     dem_content_buff[BytFldPos] = (tmp_data & 0xff); 
     dem_content_buff[BytFldPos + 1] = (tmp_data >> 8) & 0xff ; 
     dem_content_buff[BytFldPos + 2] = (tmp_data >> 16) & 0xff ; 
     dem_content_buff[BytFldPos + 3] = (tmp_data >> 24) & 0xff; 
     dem_content_buff[BytFldPos + 4] = (tmp_data >> 32) & 0xff; 
     dem_content_buff[BytFldPos + 5] = (tmp_data >> 40) & 0xff; 
     dem_content_buff[BytFldPos + 6] = (tmp_data >> 48) & 0xff; 
     dem_content_buff[BytFldPos + 7] = (tmp_data >> 56) & 0xff; 
     } 
2

Quel est le type de tmp_data?

Ma conjecture est que tmp_data est seulement de 32 bits, d'où l'erreur. Il doit s'agir d'un entier non signé de 64 bits, ce qui peut être obtenu en utilisant le type de données unsigned long long non standard (mais bien pris en charge).

+0

Ce code ne met aucune restriction sur le type de 'dem_content_buff'. En fait, il semble que ce soit un type 8 bits. –

+0

tmp_data est un int. – Blade3

+0

@Carl, Bien repéré, j'ai mal lu le code. –

1

Pour l'opérateur de décalage au travail décalage plus de 32 bits, tmp_data aura besoin d'être un type 64 bits - comme plusieurs autres réponses indiquées.

Cependant, vous aussi voulez simulated_data être un tableau d'un certain type 64 bits autrement tmp_data sera toujours zéro (ou un ensemble de signe étendu de 1 bits) via les bits les plus significatifs lorsque vous affectez sa valeur d'origine:

tmp_data = simulated_data[index_data]; 
1

Si vous utilisez Visual studio, assurez-vous que vous définissez tmp_data comme:

__int64 tmp_data;    // Visual studio version 

au lieu de

unsigned long long tmp_data; // GCC version