Является ли поведение приведения отрицательного двойного к 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).