关于强制类型转换(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",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;所以这有可能是编译器的问题。

时间: 2024-08-09 10:44:17

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

C语言中将0到1000的浮点数用强制类型转换的方式生成一幅图像

搞过计算机图像的人都知道,图像中的每一个像素通常为一个整型数,它可以分成4个无符号的char类型,以表示其RGBA四个分量.一幅图像可以看做是一个二维整型数组.这里我会生成一个float数组,其数组大小为1000000,刚好1000*1000,数组内的浮点数的数值范围在0到1000.0之间,呈等差数组排列,相邻两数的差为0.001.然后将其每一个浮点数强制转化成一个整型数或三个unsigned char型,以决定像素的RGB三个通道分量,看看其生成的图像是什么样子. 前几天写了一篇文章是在C语言

C语言的 (强制类型转换) 以及 '字符字面值'

C语言的显式/隐式类型转换,都有一个中间变量的存在,原数据的类型.内容都不变. 以下代码,都用GCC编译. 1 #include<stdio.h> 2 3 int main() 4 { 5 printf("%d %d\n", 'a', sizeof((int)'a')); //输出为97,4. sizeof的作用对象为一个int型中间变量 6 7 char c = 255; 8 printf("%d\n", c); //输出-1. char型的c已溢出,

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

强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整型数据的指针类型,后赋给p 注示:类型说明符和表达式都必须加括号,表达式为单个变量可不加括号. 总结:只要看到(类型说明符) (表达式) 的一定为强制类型转换:如(int *) 0x0022; 再举一例:#define DIR *((volatile unsigned int *) 0x0022)

c语言强制类型转换

一.强制类型转换 printf("3/2+100.5=%f",3/2+100.5);//100.5错误表达 printf ("    (float)3/(float)2 +100.5f=%f \n",    (float)3/(float)2 +100.5f); // (float) 前缀 二.自动类型转换和隐式类型转换 例1: printf ("    3/2+100.5=%f \n",       (float)3/2 +100.5f); p

C语言的强制类型转换

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

C语言强制类型转换和浮点数带来的问题

强制类型转换: (int)(6.9)的结果就是6 1/(float)(sum)的结果是浮点数 浮点数带来的问题 float i=6.25,实际上计算机很可能把i存为6.249999.. 用浮点型存放小数,实际存放的是该小数的近似值 存放5.5,实际存放的是5.499999 有一个浮点型变量x,如何判断x的值是否为0 因为0.0000001也可能被存成是0,拿这个数和0.000000000000000000000000001比较,如果较小,那么就是0了 for(i=5.25;i<6.25;i++)

C++强制类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast

1. c强制转换与c++强制转换 c语言强制类型转换主要用于基础的数据类型间的转换,语法为: (type-id)expression//转换格式1 type-id(expression)//转换格式2 c++除了能使用c语言的强制类型转换外,还新增了四种强制类型转换:static_cast.dynamic_cast.const_cast.reinterpret_cast,主要运用于继承关系类间的强制转化,语法为: static_cast<new_type> (expression) dynam

C++程序设计方法3:强制类型转换

强制类型转换(显示转换) dynamic_cast<Dst_Type>(Src_var) Src_var必须是引用或者指针类型,Dst_Type类中含有虚函数,否则会有编译错误: 若目标类与源类之间没有继承关系,则转化失败,返回空指针(注:失败并不是运行崩溃) static_cast<Dst_Type>(Src_var) 基类对象不能转换为派生类对象,但基类指针可以转换为派生类的指针 派生类对象(指针)可以转化为基类的对象(指针) 没有继承关系的类之间,必须具有转换途径才能进行转换

C++四种强制类型转换关键字

C语言使用强制类型转换(Type Cast)很简单,不管什么类型的转换,形式都如下: TYPE b = (TYPE)a; c++提供了4种类型转换操作符来应对不同场合的应用. const_cast  static_cast dynamic_cast reinterpreter_cast 4种关键字的使用形式如下: TYPE b = static_cast(TYPE)(a) 1.const_cast 去掉类型的const或volatile属性 const SA ra ={1} ; //ra.i =