因为今天看的代码中用到了结构体的强制类型转换,就很想了解一下结构体的强制类型转换是怎样的。
一个结构体如下:
在下面这段代码中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",b);得到的结果为0.00000.

所以修改代码为printf("%f",*b);得到了结果52.000000.但是如果保留printf("%f",b);会再一次输出结果52.000000
一开始我以为这是codeblocks的编译器进行了缓存做了什么优化。但是在VC++编译器中运行这段代码得到了不同的结果。
 
 
在VC++中,同时出现printf("%f",*b);和printf("%f",b);输出的结果分别是52.00000和0.00000;所以这有可能是编译器的问题。

关于强制类型转换(c语言)的更多相关文章

  1. C语言结构体的强制类型转换

    陈浩师兄03年的一篇博客<用C写有面向对象特点的程序>描述了用C语言来实现类似C++类继承的方法,这样方法的核心要点就是结构体的强制类型转换,让我来简单分析分析C语言中的结构体强制类型转换 ...

  2. C语言中强制类型转换总结

    C语言中强制类型转换总结  ● 字符型变量的值实质上是一个8位的整数值,因此取值范围一般是-128-127,char型变量也可以加修饰符unsigned,则unsigned char 型变量的取值范围 ...

  3. C语言笔记 11_头文件&强制类型转换&错误处理&递归

    头文件 头文件是扩展名为 .h 的文件,包含了 C 函数声明和宏定义,被多个源文件中引用共享.有两种类型的头文件:程序员编写的头文件和编译器自带的头文件. 在程序中要使用头文件,需要使用 C 预处理指 ...

  4. c语言强制类型转换

    一.强制类型转换 printf("3/2+100.5=%f",3/2+100.5);//100.5错误表达 printf ("    (float)3/(float)2 ...

  5. C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)

    强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整 ...

  6. C语言的强制类型转换

    1.什么是强制类型转换:遇到一些类型不同的一些数据之间的表达运算 ,需要将较高的数据类型转换成较低类型时. 2.强制类型的形式: (强制转换的类型)(表达式): 2.强制类型的使用: float a, ...

  7. C语言中的强制类型转换

    先直接放程序吧,后面还有总结. -------------------------------------------start------------------------------------ ...

  8. C语言:强制类型转换

    #include <stdio.h> //强制类型转换 //写法:(类型标识符)变量:(类型标识符)常量:(类型标识符)(表达式):三种格式 main() { float a=7.5f; ...

  9. C++强制类型转换

    C语言强制类型转换过于粗暴,任意类型之间都可以进行转换,编译很难判断其正确性; 难于定位,在源码中无法快速定位所有使用强制类型转换的语句. C++将强制类型转换分为4种不同的类型:static_cas ...

随机推荐

  1. EL 表达式

    转载自 :http://blog.csdn.net/qwerasdf123/article/details/4189889 EL表达式      1.EL简介 1)语法结构        ${expr ...

  2. Winform_ComBox三种赋值方式

    第一种方法: DataTable dt = new DataTable(); dt.Columns.Add( "name" ); dt.Columns.Add( "val ...

  3. 使用ICMP协议Ping网络主机

    #coding:utf-8 #!/usr/bin/env python import os import argparse import socket import struct import sel ...

  4. 获取iframe外边数据

    http://biancheng.dnbcw.info/javascript/178184.html

  5. Django中如何配置Database缓存?

    BACKEND: django.core.cache.backends.db.DatabaseCache LOCATION: 数据库表名 示例: CACHES = { 'default': { 'BA ...

  6. Lua中点和冒号的区别

    在使用lua设计类时'.'和':'的区别主要在于使用'.'必须手动加self参数,使用':',可以隐藏这个参数,使用'.'调用使用':'定义的函数时,要注意,函数的第一个参数为self,如 funct ...

  7. jQuery与DOM相互转换

    先执行一下代码 $(function () { var div=$("<div></div>"); console.log(div); }); (注意,di ...

  8. Win7下Maven的安装与配置

    简介  官网:https://maven.apache.org/ Apache Maven,是一个(特别是Java软件)项目管理及自动构建工具,由Apache软件基金会所提供.基于项目对象模型(Pro ...

  9. (04)odoo视图操作

    -----------------更新时间19:04 2016-09-29 星期四11:17 2016-09-18 星期日18:13 2016-04-05 星期二15:05 2016-03-14 星期 ...

  10. LayoutInflater和inflate()方法的用法

    LayoutInflater作用是将layout的xml布局文件实例化为View类对象. 实现LayoutInflater的实例化共有3种方法, (1).通过SystemService获得 Layou ...