搜索
您的当前位置:首页关于强制类型转换(c语言)

关于强制类型转换(c语言)

来源:小侦探旅游网
关于强制类型转换(c语⾔)

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

在下⾯这段代码中rbuf->reqCmdBuf是⼀个空指针,⾸先将这个空指针赋值给⼀个uint8_t类型的指针buf。然后将buf指针强制类型转换为rdma_write_msg_head结构体类型指针。那再这⾥是怎么转换的呢?

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

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

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

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

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

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

总结:

为什么⽅法1和⽅法2得到的结果不同呢? 总结原因,可以这样认为:

在⽅法1中,直接对整型变量a进⾏类型转换,那么会先将⼗六进制数作为整型处理,也就是1112539136, 将1112539136强制转换为浮点型,那么得到的结果就是1112539136.000000.

⽽在⽅法2中,将整型变量a的地址转换为浮点型的,那么要将变量a地址中的内存值转换为浮点型,就是将 原地址值中的⼗六进制数按照浮点型的格式解释,从⽽得到结果52.000000.

PS.在测试实验的过程中,犯了⼀个简单的错误,从⽽得到了下⾯的问题:在试图输出浮点型指针b的指针时,直接printf(\"%f\得到的结果为0.00000.

所以修改代码为printf(\"%f\得到了结果52.000000.但是如果保留printf(\"%f\会再⼀次输出结果52.000000

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

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

因篇幅问题不能全部显示,请点此查看更多更全内容

Top