Я получил программузначения Хранить в 64 разрядное целое число в 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));
}
Это хранит x,y,z
в 32-разрядном регистре, но ее успешное ТОЛЬКО для { (x,y,z)< 256}
. Если я хочу, чтобы это было возможно для x,y,z
, чтобы получить значения 2^10 (1024)
(так (x,y,z)<1024
), как это может произойти? Я знаю, что я должен использовать 64-битный регистр (?), Но я застрял на этом, потому что что-то происходит со сменой.
Любые идеи?
Вы должны использовать 64 бит переменной а и ... просто изменить как сдвиг и маски. 1024 - это 10 бит, а затем сдвиг на 10, а затем на 20 и маска с 0x3FF –
. В 'stdint.h' могут быть *' int64_t/uint64_t' (но они не являются обязательными). –
Ваш код вызывает неопределенное поведение на платформах с 'int', например. 16 бит. В общем, это плохая идея сдвинуть знаковые целые числа, если вы не можете гарантировать, что эти сдвиги никогда не вызовут неопределенное поведение. Это означает, что следует избегать определенных комбинаций значений/сдвигов. – Olaf