Является ли поведение приведения отрицательного двойного к unsigned int, определенного в стандарте C?

У меня есть код, который работает на разных платформах, которые, похоже, получают разные результаты. Я ищу правильное объяснение.

Windows:

double dbl = -123.45; 
int d_cast = (unsigned int)dbl; 
// d_cast == -123

WinCE (ARM):

double dbl = -123.45; 
int d_cast = (unsigned int)dbl; 
// d_cast == 0

EDIT:

Спасибо за указание в правильном направлении.

Исправить обходной путь

double dbl = -123.45; 
int d_cast = (unsigned)(int)dbl; 
// d_cast == -123
// works on both. 

Ответ 1

Нет


Это преобразование undefined и, следовательно, не переносимо.

Согласно C99 §6.3.1.4 сноска 50:

Операция останова, выполняемая при преобразовании значения целочисленного типа в неподписанный тип, не должна выполняться, когда значение реального плавающего типа преобразуется в неподписанный тип. Таким образом, диапазон переносимых реальных значений плавающего значения равен (-1, Utype_MAX + 1).