Вы можете объединить два 4-байтовых случайных целых числа для получения 8-байтового:
#include <stdint.h>
...
uint64_t random =
(((uint64_t) rand() << 0) & 0x00000000FFFFFFFFull) |
(((uint64_t) rand() << 32) & 0xFFFFFFFF00000000ull);
Поскольку rand
возвращает int
и sizeof(int) >= 4
практически на любой современной платформе, этот код должен работать. Я добавил << 0
, чтобы сделать намерение более явным.
Маскирование с помощью 0x00000000FFFFFFFF
и 0xFFFFFFFF00000000
предназначено для предотвращения перекрытия битов в двух числах в случае sizeof(int) > 4
.
EDIT
Поскольку @Banthar прокомментировал, что RAND_MAX
не обязательно 2 ^ 32
, и я думаю, что он гарантированно будет по крайней мере 2 ^ 16
, вы можете объединить четыре 2-байтовых числа просто для уверенности:
uint64_t random =
(((uint64_t) rand() << 0) & 0x000000000000FFFFull) |
(((uint64_t) rand() << 16) & 0x00000000FFFF0000ull) |
(((uint64_t) rand() << 32) & 0x0000FFFF00000000ull) |
(((uint64_t) rand() << 48) & 0xFFFF000000000000ull);