强制转换返回强制类型的函数的返回值

巴巴尔阿里

我想从编译器的角度知道当一个强制类型返回给一个函数时会发生什么,该函数也对返回值进行类型转换。我想知道显式类型转换返回值的优缺点是什么。

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

类型擦除后何时强制转换函数的通用返回值?

不兼容的指针类型和返回值使整数无强制转换问题

C - 将函数调用返回值强制转换为 void

如何在玩笑中强制函数的返回值?

MethodHandle 强制转换返回类型

返回错误的类型-强制转换?

在函数中强制返回类型

强制转换为右值引用以“强制”返回值的移动-澄清

使用Typescript强制返回值

在C中强制转换函数指针的返回类型

当我使用void函数的返回值(通过强制转换函数指针)时,会发生什么?

当具有有界类型参数的类的方法返回其自身类型的值时,如何让返回值保持通用(不进行强制转换)?

Python Numpy:numpy.exp(x)如何将此Sigmoid函数的返回值强制转换为ndarray?

类型转换C函数的返回值是否可以接受?

PHP重写弱函数返回类型强制

未强制执行函数返回类型

如何强制返回值与 Crystal 中的参数值类型相同?

将返回值强制转换为指针时,c中的内存分配

只要忽略返回值,是否强制转换[X,Y] X => Y到X =>()安全?

为什么此Java方法返回值使用&符号进行强制转换?

为什么我们要强制转换malloc的返回值?

强制函数返回值并产生编译错误C#

如果没有运算符,什么强制函数表达式返回值

如何在函数返回值上强制TypeScript多余属性检查

没有从“int”类型的返回值到函数返回类型(向量)的可行转换

没有从 bankAccount 类型的返回值到函数返回类型 int 的可行转换

返回值的隐式类型转换

如何在C中强制使用返回值

如何在通用类的返回值中强制键入?