bekam ich ein ProgrammShop-Werte in 64-Bit-Integer in C
#include <stdint.h>
#include <stdio.h>
int main(void)
{
int i;
int x = 128;
int y = 128;
int z = 2;
int32_t coordinates = x | (y << 12) | (z << 16);
fprintf(stdout, "x = %d\n", (coordinates & 0xFF));
fprintf(stdout, "y = %d\n", ((coordinates >> 8) & 0xFF));
fprintf(stdout, "z = %d\n", ((coordinates >> 16) & 0xFF));
}
Das speichert x,y,z
in 32-Bit-Register, aber seine erfolgreiche NUR für { (x,y,z)< 256}
. Wenn ich möchte, dass x,y,z
Werte von 2^10 (1024)
(also (x,y,z)<1024
) erhalten kann, wie kann das passieren? Ich weiß, dass ich ein 64-Bit-Register (?) Verwenden sollte, aber ich stecke darauf fest, weil etwas mit Schichten vor sich geht.
Irgendwelche Ideen?
Sie ein 64-Bit-Variable und beide verwenden sollen ... nur Verschiebung und Masken ändern. 1024 ist 10 Bits, dann um 10 und dann um 20 und Maske mit 0x3FF –
Es * kann sein * * int64_t/uint64_t Typen in 'stdint.h' (aber sie sind nicht obligatorisch). –
Ihr Code ruft undefiniertes Verhalten auf Plattformen mit 'int' auf, die z. 16 Bits. Im Allgemeinen ist es eine schlechte Idee, vorzeichenbehaftete ganze Zahlen zu verschieben, es sei denn, Sie können garantieren, dass diese Verschiebungen niemals undefiniertes Verhalten auslösen. Was bedeutet, bestimmte Werte/Schicht-Anzahl-Kombinationen zu vermeiden. – Olaf