Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;从函数返回时的基本类型降级_C++_Compiler Warnings_Type Conversion - Fatal编程技术网

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是的,没错!:-)回答得好。我刚刚将我的答案与你的答案链接起来,以供参考:-)