2017-02-16 8 views
3

У меня есть большая кодовая база, которую мне нужно дезинфицировать и натолкнулась на какой-то код, подобный тому, который приведен ниже, о котором GCC предупреждает меня, и это не имеет никакого смысла для меня.Кастинг аргумента float для unsigned, когда функция принимает подписанный int

void SetValue(int32_t value); // implementation not important 

int main() 
{ 
    //... 

    float val = -10.0f; // real value comes from a function, but can be negative 

    //... 

    SetValue(uint32_t(val)); // huh? 

    //... 
} 

Любая причина, чтобы заставить актеров к unsigned int, если функция принимает signed int?
Это происходит несколько раз по всей кодовой базе, поэтому это не один случай.

Это просто ошибка или есть какой-то трюк, который мне не хватает?

РЕДАКТИРОВАТЬ: Для очистки GCC дезинфицирующее средство выбрасывает runtime error: value -10 is outside the range of representable values of type 'unsigned int'.

+0

Выглядит скорее как ошибка для меня, возможно, просто положить туда, чтобы скрыть предупреждение. – Marco

+0

Уточните с помощью [MCVE] - и точное сообщение об утере! –

ответ

3

В показанном коде отливка не имеет смысла. Преобразование числа с плавающей точкой в ​​целочисленный тип, в котором значение находится вне допустимых границ, имеет неопределенное поведение. Вы не хотите UB.

Мое предположение: Приведение в действие должно явно указывать, что float преобразуется в целое число, но тип ошибочен по ошибке.

+1

На самом деле это неопределенное поведение (переопределение с плавающей запятой не определено). [conv.fpint]/1. Таким образом, код определенно является ошибкой. –

+0

@ М. М. спасибо, я этого не знал. Исправлена. – user2079303

1

Использование явного литья позволяет многим компиляторам выдавать предупреждение о неявном преобразовании и возможной потере данных. это не редкость вставлять в броски, чтобы уменьшить количество предупреждений компилятора: вы даете компилятору понять, что вы в порядке с coversion.

В этом случае значение передается в unsigned int, а затем возвращается обратно к подписанному int. Вероятно, нет причин для этого. Я предполагаю, что функция однажды взяла unsigned int, и приведение было связано с этим (явное приведение, чтобы уменьшить предупреждения), но позже профиль функции изменился, но другая часть не была обновлена.