我有一个很大的代码库,我需要对其进行清理,并且遇到了类似下面GCC警告我的代码,这对我没有任何意义。
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 :(得分:3)
在显示的代码中,演员似乎毫无意义。将浮点转换为值不在可表示边界内的整数类型具有未定义的行为。你不想要UB。
我的猜测:强制转换显示浮点数被转换为整数,但错误地输入了类型。
答案 1 :(得分:1)
使用显式强制转换可防止许多编译器吐出有关隐式转换和可能的数据丢失的警告。使用强制转换来减少编译器警告的数量并不少见:你让编译器知道你对这个转换没有问题。
在这种情况下,将值转换为unsigned int,然后转换为signed int。完全没有理由这样做。我的猜测是函数曾经使用unsigned int,并且转换与此相关(显式转换以减少警告),但后来函数配置文件发生了变化,但其他部分未更新。