C 中的类型转换是怎么回事?

Ric*_*lac 6 c low-level

我了解 C 中的类型转换在高层次上所做的事情。我知道有时这是隐式完成的,有时需要明确完成。但是我不知道这是如何在低级别发生的:

假设GetSignal返回一个enum类型。

 uint8 outValue;
 f32_t iValue;
 iValue = (f32_t)GetSignal();
 outValue = (uint8)((i32_t)iValue);
Run Code Online (Sandbox Code Playgroud)

我的问题是这里发生了什么。我不知道在所有这些类型转换之后如何重新组织这些位。

dbu*_*ush 4

强制转换的作用是将一种类型的值转换为另一种类型的值。对于每个给定类型,该值的表示形式取决于类型。

假设GetSignal返回一个底层值为 1 的枚举。作为一个 32 位整数,它的表示如下所示(假设大端字节顺序,即从高到低):

00000000 00000000 00000000 00000001
Run Code Online (Sandbox Code Playgroud)

然后,这个整数值 1 通过显式转换转换为f32_t。假设此类型表示为 IEEE 754 单精度浮点值,其表示形式(从高到低)如下所示:

00111111 10000000 00000000 00000000
Run Code Online (Sandbox Code Playgroud)

并且这个表示存储在iValue.

然后iValue被投射到i32_t. 因此,float上述 IEEE754 浮点表示形式的值 1 将转换为int具有以下表示形式的值 1:

00000000 00000000 00000000 00000001
Run Code Online (Sandbox Code Playgroud)

这与返回的相同GetSignal。然后将该值转换为uint8具有以下表示形式的类型:

00000001
Run Code Online (Sandbox Code Playgroud)

该表示形式存储在outValue.

关于您关于添加 afloat和 an 的评论int通常的算术转换规则规定,具有 type 的值int首先隐式转换为 type float,然后可以将两个float值相加,结果具有 type float