c语言强制转换例子,关于强制类型转换(c语言)(示例代码)

因为今天看的代码中用到了结构体的强制类型转换,就很想了解一下结构体的强制类型转换是怎样的。

一个结构体如下:

3a9e30bbf57f1cf30cb5295586b46bac.png

在下面这段代码中rbuf->reqCmdBuf是一个空指针,首先将这个空指针赋值给一个uint8_t类型的指针buf。

然后将buf指针强制类型转换为rdma_write_msg_head结构体类型指针。

那再这里是怎么转换的呢?

首先,将buf指针指向的内容的前8个字节赋值给rdma_write_msg_head结构体的rwmh->len变量,然后再

将紧接着的1个字节的内容赋值给rwmh->flag。至于buf指针指向的内容中前9个字节后的内容,我认为会被舍弃掉。

30425dd9fc587b01102ff39bd55d04c7.png

在查询强制类型转换的资料时,看到了这样一个例子:

将一个十六进制的数赋值给一个整型变量,然后试图将这个整型转换为浮点型。

1、首先直接对整型强制类型转换得到的结果为1112539136.000000.如果是对整型变量的地址进行转换,结果则不同。

71a891c7c5eca3f18c384682e94960b8.png

2、可以看到,下图中是对整型变量a的地址进行强制类型转换,得到的结果为52.000000.

6c09911877146066b54e6dcc89c8d29d.png

总结:

为什么方法1和方法2得到的结果不同呢?

总结原因,可以这样认为:

在方法1中,直接对整型变量a进行类型转换,那么会先将十六进制数作为整型处理,也就是1112539136,

将1112539136强制转换为浮点型,那么得到的结果就是1112539136.000000.

而在方法2中,将整型变量a的地址转换为浮点型的,那么要将变量a地址中的内存值转换为浮点型,就是将

原地址值中的十六进制数按照浮点型的格式解释,从而得到结果52.000000.

PS.在测试实验的过程中,犯了一个简单的错误,从而得到了下面的问题:

在试图输出浮点型指针b的指针时,直接printf("%f",b);得到的结果为0.00000.

d97e8d104b2911a97e4257a2e009cf80.png

所以修改代码为printf("%f",*b);得到了结果52.000000.但是如果保留printf("%f",b);会再一次输出结果52.000000

一开始我以为这是codeblocks的编译器进行了缓存做了什么优化。但是在VC++编译器中运行这段代码得到了不同的结果。

0fbb8e27a49496d4eb9ed1f2c011886a.png

在VC++中,同时出现printf("%f",*b);和printf("%f",b);输出的结果分别是52.00000和0.00000;所以这有可能是编译器的问题。

bb00e5b0e005143d4cc556c3dc5536b9.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值