C++ C++;从函数返回时的基本类型降级
我得到了一个(预期的) 警告:大整数隐式截断为无符号类型[C++ C++;从函数返回时的基本类型降级,c++,compiler-warnings,type-conversion,C++,Compiler Warnings,Type Conversion,我得到了一个(预期的) 警告:大整数隐式截断为无符号类型[-Woverflow] 在Get2()上,但不在Get1()上。我很困惑为什么: #include <stdint.h> uint8_t Get1() { return uint8_t(uint64_t(10000)); } uint8_t Get2() { return uint64_t(10000); } int main() { return 0; } #包括 uint8_t Ge
-Woverflow
]
在Get2()
上,但不在Get1()
上。我很困惑为什么:
#include <stdint.h>
uint8_t Get1()
{
return uint8_t(uint64_t(10000));
}
uint8_t Get2()
{
return uint64_t(10000);
}
int main()
{
return 0;
}
#包括
uint8_t Get1()
{
返回uint8_t(uint64_t(10000));
}
uint8_t Get2()
{
返回uint64_t(10000);
}
int main()
{
返回0;
}
这是一些做其他事情的模板化代码的简化版本,没有硬编码值。
同样的情况发生在C++中,编译时用GCC或CLAN。< P>警告,因为有一个隐式转换(与您在代码> GET1中的显式相反)发生,编译器警告您该整数被截断。
没有报告显式的,因为您已显式地告诉编译器您正在执行截断,因此在这种情况下,警告可能是多余的。只需添加到Mr
从返回
语句语义,C11
,章节§6.8.6.4
如果执行带有表达式的return
语句,则表达式的值将作为函数调用表达式的值返回给调用方如果表达式的类型与它出现的函数的返回类型不同,则该值将被转换为具有函数返回类型的对象。
对于Get1()
,由于显式强制转换,最终的表达式类型是uint8\t
,它与函数的返回类型匹配
对于Get2()
,最终表达式类型是uint64\u t
,它与函数的返回类型uint8\u t
不匹配
因此,在
Get2()
的情况下,类型将被转换(就像通过赋值一样),并且由于类型中的错误,将产生警告。此处的关键字是隐式的。您的第一个代码段明确地将64位截断为8位,因此编译器假定您知道自己在做什么。第二个代码段隐含了这一点,因此编译器会警告您,以防您射中自己的脚。@FrédéricHamidi投诉是在Get1
上有警告,但在Get2
上没有警告,这与您的建议相反。警告是针对Get2
报告的,而不是针对Get1
@dlask噢,所以问题是问它到底意味着什么?很有帮助。@BoBTFish是的,没错!:-)回答得好。我刚刚将我的答案与你的答案链接起来,以供参考:-)