Случайное четырехбайтное число - C (СИ)
Формулировка задачи:
Добрый день. Написал функцию, которая должна возвращать ключ - массив из 255 беззнаковых целых чисел. Компилятор 32-битный, sizeof(unsigned) == 4, rand() возвращает тоже четырехбайтное число. Но проблема в том, что при записи чисел в файл в шестнадцатеричном формате видно, что третий и четвертый байт — нулевые. Почему так получается? Вот сама функция:
В файл все это пишется так:
И на выходе получается такое (скринить все не вижу смысла, такая картина везде, хоть и файл на честных 1020 байт):
unsigned *keygen()
{
unsigned *key = (unsigned *)malloc(sizeof(unsigned) * 255);
size_t i;
for (i = 0; i < 255; i++)
//key[i] = (rand() % UINT_MAX) | ((rand() % UINT_MAX) >> 16); вот так почему-то тоже не работает
key[i] = rand() % UINT_MAX;
return key;
} unsigned *gen_key = keygen();
FILE *keyfile = fopen("KEY.K", "wb");
fwrite(gen_key, sizeof(unsigned), 255, keyfile);
fclose(keyfile);Решение задачи: «Случайное четырехбайтное число»
textual
Листинг программы
key[i] = (rand() % UINT_MAX)<<16 + rand() % UINT_MAX;
Объяснение кода листинга программы
В данном коде происходит следующее:
i- это переменная, которая представляет собой индекс для массиваkey.key- это массив, в который будут сохраняться случайные четырехбайтные числа.rand()- это функция, которая генерирует случайное число.UINT_MAX- это максимальное значение для 32-битного беззнакового целого числа.(rand() % UINT_MAX)<<16- это выражение, которое генерирует случайное число в диапазоне от 0 доUINT_MAX, а затем сдвигает его влево на 16 бит.rand() % UINT_MAX- это выражение, которое генерирует случайное число в диапазоне от 0 доUINT_MAX.key[i] = (rand() % UINT_MAX)<<16 + rand() % UINT_MAX;- это строка кода, которая присваивает значение массивуkeyна основе двух случайных чисел. Первое число сдвигается влево на 16 бит, а затем оба числа складываются.