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中使用叮当作响的静态分析仪,我没有得到警告。