C++指针和指针类型强制转换

C++指针类型间强制转换-CSDN博客

深入理解指针类型间的转换-CSDN博客

C++中指针的强制转换。_JoliceYU的博客-CSDN博客

ASCII_百度百科

一、地址的本质和储存

C++中,指针的大小都是4个字节(32bits),指针的内容代表具体的地址,地址的本质就是一串0和1的机器代码。C++寻址的基本单位是字节(byte,8bits),所以寻址的范围大小是2^32个字节。任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值。这个地址就是硬件访问的依据,而名字只是提供给程序员的一种记住这个地址的方便一点的方法。

int a = 10;
float b = float(a);

当我们用a时,由于前面把a定义为int型,则编译器知道从a的地址开始向后取4个字节再把它解释成int型。那么(float)a,就是先按照int类型取出该数值,再将该数值按照int to float的规则转换成float型。

二、指针寻址

指针变量的本质:指针变量,本质上是一个变量,只是它是存放地址的变量,指针的类型代表的是它所指向的变量的类型。因此就有了指向整型、字符型、浮点型等其它类型的指针,但实际上所有类型的指针变量存放的都是int型(对于16位编译系统,int是2字节,对于32位编译系统,int是4字节)的地址。因此从本质上讲,不同类型的指针变量并没有区别(因为指针变量的类型 为int型,因此指针变量只能存放地址。注意和指针指向对象的类型区分开),指针变量所存储的地址为指针所指向的对象的首地址。 

使用指针访问变量的过程如下:

//float变量占据8字节的内存空间
float flt = 10.2;

//声明一个指针p,占据4字节的内存空间
//将float变量flt的首地址(4字节32位)赋值给指针变量p
//后续使用*p访问flt时,编译器就知道从首地址往后取8字节解释为float类型就代表flt的值
//指针类型的意义在于告诉编译器 从首地址往后取多少字节代表 变量/函数/对象 的值
//还有一点是在指针移动和指针的运算时(加、减)在内存中移动的最小字节数。
float* p = &flt; 

cout << *p << endl;

三、指针的类型转换

我们可以将指针强制转换成int型或者其他类型。同样,也可以将任何一个常数转换成int型再赋值给指针。所有的指针所占的空间大小都是4字节,他们只是声明的类型不同,他们的值都是地址指向某个东西,他们对于机器来说没有本质差别,他们之间可以进行强制类型转换。

指针 to 指针的强制类型转换是指,将指针所指的内容的类型由原先的类型转换为后面的类型:即进行变量解释的时候,解释类型的转换

//p和p1的值都是&a,但是*p是将&a地址中的值按照int型变量进行解释
//即从p中储存的a的首地址往后取4字节当作*p的值
//*p1则是将&a地址中的值按照float型变量进行解释
//即从p1中储存的a的首地址往后取8字节当作*p1的值
int a = 1;
int *p = &a;
float *p1 = (float*)p;
//pn是n1的首地址
//*pn是找到n1的首地址,往后取4字节解释为int变量,当作*pn的值
//*p是找到n1的首地址,往后取8字节解释为float变量,当作*p的值
//由于n1的首地址往后4个字节才是有意义的,所以*p会多读取后面的内存,*p的数值会出现错误

int n1 = 100;
int* pn = &n1;
float* p = NULL;
p = (float*)pn;
cout << pn << endl;
cout << *pn << endl;
cout << *p << endl;

四、一些代码例子

int* pint;
char* pchr;
float* pflt;

int  a = 2;
char b = 97;
float c = 3.5;

pint = &a;
pchr = &b;
pflt = &c;

*(int*)&a = 256;//等价于a=256;
pchr = (char*)pint;

//a是int类型,值为256,在内存中为00000000 00000000 00000001 00000000
//(int) * pchr的意思是 从a的首地址开始往后取1字节解释为char类型再强制转换为int类型
//(int)*(pchr+1)的意思是 从a的首地址加一个char大小的地址开始,
//往后取1字节解释为char类型再强制转换为int类型
//后面类似
//因为局部变量储存在栈区,栈的生长方式向下,内存地址从高到低,所以a的首地址是最后8位,
//后续+1操作地址递增,所以输出是0100,而不是0010
//若a=97,则输出97 0 0 0
cout << (int) * pchr << endl;
cout << (int)*(pchr+1) << endl;
cout << (int)*(pchr+2) << endl;
cout << (int)*(pchr+3) << endl;

/*
输出
0
1
0
0
*/
int a[4] = { 1, 2, 3, 4 };
cout << a << endl; //输出000000FEDF4FF788,a是数组名,a的值也是数组第一个元素a[0]的地址
cout << * a << endl; //输出1,a[0]的值
cout << typeid(*a).name() << endl; //输出int,a是int*类型的指针,所以*a是int类型
cout << a + 1<< endl; //输出000000FEDF4FF78C,a是int*类型的指针,所以a+1使得地址增加4字节
cout << *(a + 1) << endl; //输出2,a+1也是int*类型的指针
cout << typeid(*(&a)).name() << endl; //输出int [4],&a是int (*)[4]类型的指针,
                                      //即&a是一个数组指针,指向一个有4个元素的数组,所以*(&a) 
                                      //的类型是int [4]
cout << &a + 1 << endl; //输出000000FEDF4FF798,&a是int (*)[4]类型的数组指针,数组中每个元素为4字节,
                        //所以&a+1使得地址增加4*4字节
cout << (int*)(&a + 1) << endl; //输出000000FEDF4FF798,指针值不变,类型从int (*)[4]强制转换为int*
cout << typeid(*(int*)(&a + 1)).name() << endl; //输出int
cout << (int)a << endl; //输出-548407416,将a的值转换成十进制int类型输出
cout << (int)a + 1 << endl; //输出-548407415
int (*p)[4] = &a; //初始化一个数组指针
cout << p + 1; //输出000000FEDF4FF798

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Verilog是一种硬件描述语言,主要用于电子设计自动化和数字逻辑电路的描述与仿真。在Verilog中,整数和浮点数表示不同的数据类型,因此需要进行强制类型转换才能在它们之间进行互相转换。 在Verilog中,整数强制转换为浮点数可以通过使用系统函数来实现。具体而言,可以使用$bitstofloat函数将整数转换为浮点数。该函数将指定的整数作为输入,并将其解释为等效的浮点数。 以下是一个例子,展示了如何使用Verilog中的整数强制转换为浮点数: module convert_example; reg [31:0] integer_number; real float_number; initial begin integer_number = 42; // 设置整数值为42 float_number = $bitstofloat(integer_number); // 使用$bitstofloat进行强制转换 $display("Integer Number: %d", integer_number); $display("Converted Float Number: %f", float_number); end endmodule 在上述例子中,整数值42被设置给一个32位的寄存器integer_number。然后,使用$bitstofloat函数将整数强制转换为浮点数,并将结果存储在一个real类型的变量float_number中。最后,使用$display函数将整数和转换后的浮点数进行显示。 需要注意的是,Verilog中的整数强制转换为浮点数仅适用于32位的整数,且浮点数类型必须为real。对于其他位宽和数据类型的转换,可能需要使用其他方式进行处理。 总结起来,Verilog中的整数强制转换为浮点数可以通过使用$bitstofloat函数来实现。通过将整数值作为参数传递给该函数,可以将其解释为等效的浮点数。这样,就可以在Verilog中对整数和浮点数进行互相转换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值