c/c++练习之强制类型转换

代码:

#include<iostream>
using namespace std;

int main()
{
    int a = 123456789;

    int *pi = &a;
    cout<<"*pi="<<*pi<<endl;    //*pi = 123456789

    short *ps = (short*)&a;     //*ps = -13035
    cout<<"*ps="<<*ps<<endl;

    char *pc = (char*)&pc;     
    cout<<"*pc="<<*pc<<endl;
}

解释:
##pi指针变量的类型与变量a的类型相同,所以pi的指向的值就是a的值,a的值转换成16进制如下:

123456789 = 0x07 5B CD 15

##由于ps时short类型的指针变量,所以对a的地址做了强制类型转换,否则会因为左右两边类型不相同而不能赋值
 可以查看到a在内存中的存储如下:

(gdb) x/4xb &a
0x7fffffffe05c:	0x15	0xcd	0x5b	0x07
	  			5c	 	5d		 5e		 5f

 已知强转就是忽略类型,将变量重新看为另一种类型,而short类型为2个字节,且ps中存储的值时a的首地址:

 (gdb) p ps
 $2 = (short *) 0x7fffffffe05c
 因此ps的指向的值应该为a在内存从首地址开始向下的两个字节:0x15 0xcd
 则*ps = 0xcd15 = 1  	100 1101 0001 0101‬
				符号位	    数字位

可以看到由于此二进制数符号位为1,则它是一个负数,负数在计算机中以反码形式存储,则它的原码就是数字位-1再取反:
 即:1 011 0010 1110 1011 = -13035就是输出
##pc与ps原理相同,但是由于pc为字符型变量,所以最后输出是经过ASCⅡ码转换后的符号,
由于char类型取1个字节,所以*pc = 0x15 = 21 ==> ASCⅡ码表中对应21的字符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值