我想从编译器的角度知道当一个强制类型返回给一个函数时会发生什么,该函数也对返回值进行类型转换。我想知道显式类型转换返回值的优缺点是什么。
static uint16_t sResult_U16;
static uint16_t GetMyResult(void)
{
return (uint16_t)sResult_U16;
}
对比
static uint16_t GetMyResult(void)
{
return sResult_U16;
}
如果返回类型与函数类型不同,编译器会翻译什么?例如。
static int16_t sResult_S16;
static uint16_t GetMyResult(void)
{
return sResult_S16;
}
从编译器的角度来看,这(uint16_t)sResult_U16;
是无稽之谈,因为类型sResult_U16
已经与返回类型相同。在第一种情况下,它会简单地忽略无用的强制转换。
在第二种情况下,您使用与返回类型不同的类型。然后将变量转换为与返回类型相同的类型,这实际上是通过将有符号变量的原始二进制表示形式转换为原始二进制无符号等价物来完成的(详细的形式规则在底部引用)这个答案)。
正式的细节可以在 C17 6.8.6.4/3 中找到,它说:
如果表达式的类型与其出现的函数的返回类型不同,则该值将被转换为如同赋值给具有函数返回类型的对象一样。
其中“好像通过分配”是重要的部分 - 这与使用=
. 所以我们必须查找分配 6.5.15.1 的规则:
在简单赋值(=) 中,右操作数的值被转换为赋值表达式的类型,并替换存储在左操作数指定的对象中的值。
这种转换是隐式发生的,不需要演员表 - 您示例中的演员表只是杂乱无章。
在特定情况下,会发生从有符号到无符号的整数转换 (6.3.1.3):
否则,如果新类型是无符号的,则通过重复加或减一个新类型可以表示的最大值来转换该值,直到该值在新类型的范围内。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句