iPhone: плавающий бросок к неподписанному ints установлен на 0, если они отрицательны?

попробовать:

volatile float bob = -344.0f;
unsigned int fred = (unsigned int)bob;

printf("%d\n",fred);

вывод будет 0.

очевидно, я ожидаю, что это повторится так же, как если бы я бросил от интервала со знаком до неподписанного интервала (который действительно переносится и действует как ожидалось на iPhone),

мы предполагаем, что это - что-то, чтобы сделать с настройками с плавающей точкой.

какие-либо идеи?

7
задан matt 22 March 2010 в 07:40
поделиться

3 ответа

Этого следовало ожидать - приведение отрицательного float к unsigned int приводит к неопределенному поведению (UB). Если вы хотите, чтобы значение обернулось (что также является UB, BTW), то вам нужно сначала привести к (signed) int, а затем к unsigned int. В идеале вы вообще не должны полагаться на UB и должны найти лучший способ сделать то, что вам нужно.

11
ответ дан 6 December 2019 в 14:03
поделиться

Трансляция через подписанное int.

0
ответ дан 6 December 2019 в 14:03
поделиться

§6.3.1.4 стандарта C:

Когда конечное значение реального плавающего типа преобразуется в целочисленный тип , отличный от _Bool, дробная часть {{1} } отбрасывается (т. е. значение усекается до нуля). Если значение составной части не может быть представлено целочисленным типом, поведение не определено.

Как сказал Пол Р , это неопределенное поведение.

4
ответ дан 6 December 2019 в 14:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: