O comportamento de converter um duplo negativo em unsigned int está definido no padrão C?

Eu tenho código que é executado em diferentes plataformas que parece obter resultados diferentes. Eu estou procurando uma explicação adequada.

Janelas :

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 

EDITAR:

Obrigado por apontar na direção certa.

corrigir solução alternativa

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

Não


Essa conversão é indefinida e, portanto, não é portável.

C99 / C11 6.3.1.4

Quando um valor finito do tipo flutuante real é convertido em um tipo inteiro diferente de _Bool, a parte fracionária é descartada (isto é, o valor é truncado em direção a zero). Se o valor da parte integral não puder ser representado pelo tipo inteiro, o comportamento é indefinido.

De acordo com C11 6.3.1.4 nota de rodapé 61:

A operação remanescente executada quando um valor do tipo inteiro é convertido em tipo não assinado não precisa ser executada quando um valor do tipo flutuante real é convertido em tipo não assinado. Assim, o intervalo de valores flutuantes reais portáteis é (−1, Utype_MAX + 1).