代码:
#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的字符