C++ 从uint8_t到浮动的铿锵整齐的变窄转换
当我从一个C++ 从uint8_t到浮动的铿锵整齐的变窄转换,c++,clang-tidy,cpp-core-guidelines,C++,Clang Tidy,Cpp Core Guidelines,当我从一个uint8\u t转换为一个float时,我得到了一个非常清晰的警告,上面写着缩小从int到float的转换范围,据我所知,这并不是缩小的转换,因为float可以代表uint8\u t可以代表的每个整数 代码示例: uint8_t testVar = 8; float test2 = 2.0f * testVar; clang tidy用警告标记第二行:缩小转换范围:缩小从“int”到“float”的转换范围。在我的IDE中,波形显示在testVar下 根据,如果我们从整数转换为更窄
uint8\u t
转换为一个float
时,我得到了一个非常清晰的警告,上面写着缩小从int到float的转换范围
,据我所知,这并不是缩小的转换,因为float
可以代表uint8\u t
可以代表的每个整数
代码示例:
uint8_t testVar = 8;
float test2 = 2.0f * testVar;
clang tidy用警告标记第二行:缩小转换范围:缩小从“int”到“float”的转换范围。在我的IDE中,波形显示在testVar
下
根据,如果我们从整数转换为更窄的浮点值(例如,uint64\u t to float)
,则应标记此警告,但据我所知,float
不小于uint8\u t
我是从根本上误解了这些数据类型,还是这里发生了其他事情
如果有必要的话,我使用的是LLVM 11.0.0版。我认为问题在于
uint8\u t
被隐式转换为unsigned
,然后再转换为float
。显然,clang tidy不是很聪明。@john如果我错了就纠正我,但我认为u
已经代表未签名的。我的IDE告诉我,<>代码> uint 8xt 只是一个别名,用于<代码>未签名char < />代码。是的,但是C++的规则说,当你在表达式中使用<代码> uint 8t t <代码>时,它被隐式转换为<代码>未签名的int 。这显然被称为“叮叮当当”,因为它不够深入。这里有两点可能会误导它。1. float
是有符号的,它总是小于unsigned
类型的范围。2. float
覆盖的范围小于int
。尽管uint8_t最终可以归结为与unsigned char
等效的东西,但正如前面所述,clangtidy并没有深入到那么深的程度。只是出于好奇——这个警告是在您实际运行clangtidy时生成的,还是只是IDE文本编辑器中的一个小动作?如果是后者,那么可能是IDE的“智能感知”功能没有正确使用clang tidy。在VS-2019中使用叮当作响的静态分析仪,我没有得到警告。