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?
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