С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 28.06.2019
Сообщений: 4

Для чего в rand() использовано приведение типа к (unsigned int)?

28.06.2019, 01:30. Показов 1213. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В учебнике Кернигана Ритчи "Язык программирования С" приведена функция rand() из стандартной библиотеки, которая генерирует псевдослучайные числа. Написано что она иллюстрирует приведение типов и что она переносима между системами. Вот её код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
unsigned long int next=1;
 
/*rand возвращает псевдослучайное число от 0 до 32767 */
int rand(void)
{
next=next*1103515245 + 12345;
return (unsigned int)(next / 65536) % 32768;
}
/*srand устанавливает инициализатор для rand*/
void srand(unsigned int seed)
{
next=seed;
}
Вопрос в том, что я никак не могу понять для чего здесь вообще приведение к типу (unsigned int)? Книга 90ых годов, когда ещё int был 16 битным на многих системах. Так вот мои суждения такие, что обе константы в данной строке будут signed long int (в книге написано что десятичные константы не могут быть unsigned int, а только unsigned long int). Переменная next это unsigned long int и результат его деления на 65536 будет тоже unsigned long int. Далее он приводится к unsigned int возможно при этом урезаясь до 16 бит, но потом тут же опять будет преобразован в long int, потому как 32768 это long int. Зачем это всё надо? Подозреваю, что для переносимости, но я думал пол дня над этим и так и не понял для чего может пригодиться это приведение типа. Если кто знает для чего оно, объясните пожалуйста.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.06.2019, 01:30
Ответы с готовыми решениями:

Определение типов. Приведение int к unsigned int
При таком определении 5 рассматривается как int. Как при определении указать что 5 будет именно unsigned int? unsigned int n=5; ...

Const unsigned int flags - для чего эти флаги?
Кто может подсказать что это за флаги Const unsigned int flags , для чего они нужны и какие бывают) А еще что значит если const unsigned...

Поместить двоичный код, в веденной строке, в переменную типа int и unsigned int.
Пользователь вводит двоичную строку (32 символа). Поместить двоичный код, в веденной строке, в переменную типа int и unsigned int.

7
 Аватар для 7533620
163 / 70 / 39
Регистрация: 28.05.2019
Сообщений: 242
28.06.2019, 03:42
Цитата Сообщение от magbit Посмотреть сообщение
Книга 90ых годов
Зачем такие книги вообще читать? Вернее понятно зачем, можно почитать какие-то общие рекомендации, но вдумываться в код я бы не стал
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
28.06.2019, 09:18
magbit, если речь об С99 то, мне кажется что здесь дело в том что бы оператор % возвращал значение с правильным знаком, т.к. в Си знак результата был таким же как и знак делителя, в то время как результатом остачи от деления ожидался знак делителя. Т.к в Си оператор % - это не совсем тот modulus оператор.
Т.е. если результат next / 65536 == -1 при касте к unsigned мы получали тот же -1 только в плюсом диапазоне что равно 4294967295, т.е. это тоже бинарное представление числа -1 == 0xFFFFFFFF.
1
0 / 0 / 0
Регистрация: 28.06.2019
Сообщений: 4
28.06.2019, 13:41  [ТС]
Да возможно это связано с делением по модулю, в книге как раз упоминается, что в разных системах оно было реализовано по разному, но только вот можно ли получить отрицательное число деля unsigned long int next на 65536, которое signed long int и при расширении до unsigned в старших битах будут всё так же нули. Результатом этого деления так же будет число у которого старшие 16 бит нули. При приведении его к 16 битам без знака эти нули просто обрезаются.
Единственное объяснение которое приходит в голову, это что 32768 записано как 16 битный инт со знаком и если его расширять до лонга, то оно расширится со знаком, то есть все старшие биты будут единицами. Но это звучит просто абсурдно.
Эта функция rand приведена в книге в разделе про приведение типов и она там по сути именно из-за этого (unsigned int), а я хоть убей не понимаю зачем он там, соответственно видимо я что-то не понимаю в самом приведении типов.
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
28.06.2019, 14:37
Цитата Сообщение от Azazel-San
т.к. в Си знак результата был таким же как и знак
делителя
Поправка не делителя, а делимого.
magbit, при касте к беззнаковому, знака быть не может. Потом почему вы решили что long int > unsigned int?
Что вы так обострили внимание на этих 16 битах?
0
0 / 0 / 0
Регистрация: 28.06.2019
Сообщений: 4
28.06.2019, 17:14  [ТС]
Вот в том то и дело что я не понимаю. При касте к беззнаковому знака быть не может, но и при делении беззнакового делимого next тоже ведь знака быть не должно. Зачем тогда Ритчи заостряет внимание на приведении (unsigned int) если без него результат был бы абсолютно одинаковым во всех системах?

Добавлено через 20 минут
Или давайте просто предположим, что приведения нет. У нас самый большой тип здесь unsigned long int у next. При каждой операции все операнды будут преобразованы к нему и только в конце при возврате он преобразуется в обычный int. Из производимых вычислений следует что у результата старшие 17 бит будут нулями, то есть при приведении не получится, что слишком большое число без знака превращается в отрицательное. Где тут что-то может пойти не так?
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
28.06.2019, 18:28
Цитата Сообщение от magbit Посмотреть сообщение
но и при делении беззнакового делимого next тоже ведь знака быть не должно
По стандарту, да. Тк у беззнакового приоритет больше согласно правилам каста, но может когда писали книгу таких правил еще не было? Или просто лишняя предосторожность?
0
0 / 0 / 0
Регистрация: 28.06.2019
Сообщений: 4
28.06.2019, 19:54  [ТС]
Эх, видимо Ритчи решил затралить таким образом своих потомков У него самого уже не узнаешь, что он имел ввиду.Может быть лет через 10 до меня всё-таки дойдёт для чего там был этот треклятый (unsigned int). Буду надеяться на лучшее.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.06.2019, 19:54
Помогаю со студенческими работами здесь

Создать класс для работы с одномерными динамическими массивами значений типа unsigned int
Помогите пожалуйста с задачей. Создать класс для работы с одномерными динамическими массивами значений типа unsigned int. Предусмотреть...

Для чего нужны переменные типа CHAR, SIGNED INT?
Привет всем. Я новичок в С++, в принципе я знаю, как программировать, изучил паскаль до функций с процедурами, но в C++ встретил новые...

Перевод массива unsigned char в число типа int
Добрый день всем! Есть массив, который заполняется трехзначным числом, введенным с клавиатуры (UART_ComBody), надо перевести его в число...

Приведение типа Double в int
у меня есть тип double, мне нужно конвертировать его в инт и перенести в текст бокс double a = 3,7; textBox1.Text = a; Нужно...

Не умещается значение = 4млрд, в переменной типа unsigned long int
Всем привет. В Си я новичек. Пользуюсь VS6. Написал вот это: #include <stdio.h> main() { unsigned long int i; i =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru