因为今天看的代码中用到了结构体的强制类型转换,就很想了解一下结构体的强制类型转换是怎样的。
一个结构体如下:
在下面这段代码中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. x+y = ((x&y)<<1) + (x^y) 证明

    法一:我们考虑x,y在二进制表示时候,按位相加其中第i位xi+yi = ((xi&yi)<<1) + (xi^yi)其中(xi&yi)<<1表示当xi和yi都是 ...

  2. DEDE首页会员部分,后台登陆,会员登录相关页面

    首页会员涉及部分 \templets\default\style\page.css \member\ajax_loginsta.php 会员登录页面涉及部分 \member\templets\inde ...

  3. Java replace() 方法

    Java replace() 方法 Java String类 replace() 方法通过用 newChar 字符替换字符串中出现的所有 oldChar 字符,并返回替换后的新字符串. 语法 publ ...

  4. laravel实现第三方登录

    https://github.com/laravel/socialite 这是官方的第三方登录包,支持很多国外的第三方登录 https://github.com/overtrue/socialite ...

  5. jmeter 构建一个数据库测试计划

    添加用户 第一步你想做的每一个JMeter测试计划是添加一个 线程组 元素. 的线程组 告诉JMeter的用户数量你想模拟,用户应该多长时间 发送请求,他们应该发送的请求的数量. 继续添加Thread ...

  6. HTML5自学笔记[ 3 ]表单验证反馈

    表单控件对象的validity对象可以设置或返回相关的验证信息(在invalid事件处理中获取validity对象): 属性valid:为true所有验证通过,为False至少有一种验证失败. 属性v ...

  7. (20)odoo中的action

    ---------更新时间18:06 2016-09-18 星期日15:05 2016-03-14 星期一18:07 2016-02-19 星期五---------* 窗口动作   <?xml ...

  8. mysql关于编码部分(乱码出现的原因和解决方法)

    在使用mysql客户端时,我们会经常出现一个这样一个问题,就是原先好好文字,怎么输入之后就出现乱码了呢? 出现这样的问题: 第一个原因: 可能是这是我们新安装的一个mysql,没有经过配置,第二个原因 ...

  9. la----3695 City Game(最大子矩阵)

    Bob is a strategy game programming specialist. In his new city building game the gaming environment ...

  10. 更准确的mysql全文索引

    MYSQL自带的全文索引在查找数据的时候,有非常多的限制,如字符少于3个不能搜索,常用字不能搜索 但mysql 的like进行查询的时候又非常的慢 但你需要用到比较准确的查询的时候,要么不用mysql ...