Странная побитовая операция над 16-разрядным целым числом - PullRequest
0 голосов
/ 02 февраля 2012

Я смотрю на исходный файл переменного тока и нашел этот макрос:

#define random ( (float) rand() / (float) ((1 << 31) -1) )

, тогда как в стандартном ANSI C rand () возвращает целое число в [0,32767], я действительно ценю помощьпонять, какой тип нормализации является знаменателем, потому что целое число со знаком 16-разрядное, а выражение выполняет 31-разрядное смещение.

Большое спасибо за внимание С уважением

Ответы [ 2 ]

2 голосов
/ 02 февраля 2012

rand не возвращает целое число в [0,32767] в «ANSI C». §7.20.2:

Функция rand вычисляет последовательность псевдослучайных чисел в диапазоне от 0 до RAND_MAX.

Кажется вероятным, что тот, кто написал этот макрос, работал на платформе, на которой RAND_MAX был 2147483647.


Вы также, кажется, не понимаете целые числа со знаком. int должно быть шириной не менее 16 бит, но часто оно шире.

1 голос
/ 02 февраля 2012
#define random ( (float) rand() / (float) ((1 << 31) -1) )

в системе с 16-разрядным int этот макрос является неопределенным поведением из-за выражения 1 << 31 (1 имеет тип int).

(C99, 6.5.7p3) "Если значение правого операнда отрицательно или больше или равно ширине повышенного левого операнда , поведениеundefined. "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...