Frage

Ich bin neu in der Verschiebung von Bits, aber ich versuche, den folgenden Snippet zu debuggen:

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

Ich bekomme eine Warnung und sagt, dass die Zeilen mit "32" zu "56" eine Schichtzahl haben, die zu groß ist. Das "F64" im Prädikat bedeutet nur, dass die Daten 64 -Bit -Daten betragen sollten.

Wie soll das getan werden?

bearbeiten:

Ich hätte mehr den Code einsetzen sollen.

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 (Dems [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; }

So, dem_content_buff Im Moment hält nur INTs. Kann ich dieses Array auch nicht für die 64 -Bit -Daten verwenden?

War es hilfreich?

Lösung

Stellen Sie sicher, dass Sie den 64 -Bit -Long -Typ für die TMP_DATA verwenden, wie vorgeschlagen wurde, bevor die ununterdrückte lange Länge funktionieren sollte, aber überprüfen Sie Ihre Compiler- und Architekturdokumentation.

Der Code sollte so aussehen. Stellen Sie außerdem sicher, dass Ihr DAMP_CONTENT_BUFF als unsigned char * oder unsigned char [] deklariert wird.

Ändern Sie dann Ihren Code in:

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

Andere Tipps

Was ist die Art von tmp_data?

Ich vermute, das tmp_data ist nur 32 Bit, daher der Fehler. Es muss ein 64-Bit-nicht signiertes INT sein, das mit dem nicht standardmäßigen (aber gut unterstützten) erreicht werden kann. unsigned long long Datentyp.

Damit der Schichtbetreiber mehr als 32 Bit verschieben kann, tmp_data Muss ein 64 -Bit -Typ sein - wie mehrere andere Antworten angegeben.

Sie möchten jedoch auch auch simulated_data ein Array von etwa 64-Bit-Typen ansonsten sein tmp_data wird immer Null sein (oder ein signiertes Satz von 1 Bits) in den wichtigsten Bits, wenn Sie seinen ursprünglichen Wert zuweisen:

tmp_data = simulated_data[index_data];

Wenn Sie Visual Studio verwenden, stellen Sie sicher, dass Sie TMP_DATA als:

__int64 tmp_data;              // Visual studio version

Anstatt von

unsigned long long tmp_data;   // GCC version
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top