注册 登录
编程论坛 C++教室

指针类型修饰符的强制类型转换

王一南 发布于 2010-12-07 12:16, 1728 次点击
      大家好
   short i=258;//00000001 00000010
   char *p=(char *)&i;
   cout<<endl<<int(*p)<<int(*(p+1));
  结果输出的是  21
    这个程序我不明白, 谁给我详细解释哈  谢谢
11 回复
#2
尝鲜2010-12-07 13:19
short i=258;//00000001 00000010
   char *p=(char *)&i;
   cout<<endl<<int(*p)<<int(*(p+1));。。。。。。。。
cout<<int(*p)<<int(*(p+1))<<endl;
short 两个字节,char 一个字节
p指向的是字符型的,258在内存中是 0002 0001 (16)
假设&i=0xxxxxxxxx 那么p=0xxxxxxxxx 对应 0002 :p+1=(0xxxxxxxxx+1) 对应0001
*p=0002 *(p+1)=0001
打印出的只是*p *(p+1)的ASCII值而已。。。
#3
laoyang1032010-12-07 17:29
cout<<int(*p)<<int(*(p+1))<<endl;
首先258的二进制数确实是这样的00000001 00000010
但是在内存中低八位是在前面高八位在后面(因为栈是又高地址像低地址生长的)
所以在内存中 258就是00000010  00000001
&i存的是低八位字节的地址也就是00000010  当你把它转化成字符类型也就是
一个字节的时候  就会把高八位切割掉
那么  00000010 也就是十进制的2
同理p+1也就指向了00000001内存单元那么这个显然是1
如果没有int(*p)<<int(*(p+1))那么输出来的将会是2和1所代表ASCII码字符
我输出来好像是两个笑脸  反正道理明白就行了
#4
王一南2010-12-07 23:11
回复 3楼 laoyang103
谢谢你,我基本上懂了,  但是为什么&i的地址是00000001, 不是00000001 00000010, i不是占两个字节吗?
#5
laoyang1032010-12-08 21:39
在内存中 258是00000010  00000001
在没有强制转化之前&i确实是指向这以上两个字节的内存
但是强制转化了就把后面的那个字节切割掉了 所以强制转化(切割)后
&i就指向了切割剩下的那一个字节 也就是00000010
#6
王一南2010-12-09 08:50
回复 5楼 laoyang103
(1)那它为什么不是取00000001,而是取00000010,读取内存数据不是从左往右吗?那它经过强制类型转换以后,不是应该去00000010吗?  希望你给讲解哈,谢谢

 (2) 还有,我不太明白,  就是int在内存中到底占几个字节?  这个我是不太明白,因为在c里面  他好像占两个字节,但是那天又听你说整形占四个字节,  是怎么回事

[ 本帖最后由 王一南 于 2010-12-9 08:56 编辑 ]
#7
lintaoyn2010-12-09 10:31
short i=258;//00000001 00000010
也可能是这样的。00000010 00000001
这取决于你机器的类型。(大端机还是小端机)
(1)指针存储的地址是其指向数据的低字节地址。(你就这么理解)强转是转给编译器看的,这个操作不会改变内存里的内容。改变的是什么去解释地址里的内容。
(2)int占几个节跟你的编译器有关系。(现在一般是4个字节)
(建议下载电子版的《深入理解计算机系统》第二章还是第一章有提到。)
#8
laoyang1032010-12-09 12:55
栈是由高地址像低地址生长的
你这个整数进栈的时候   是先把低八位压进去后把高八位压进去
因为栈时候后进先出的数据结构
所以258在内存中就是         (低地址端)00000010 00000001(高地址端)
而指针指向的是低地址端  所以如果想切割之后剩下一个字节
那么就应该切割除了指针所指向的那个字节的 其他字节
如果不切割后面的高地址字节  那么指针就没了指向
如果还不明白  +我QQ  553069938   我语音给你讲
#9
pangding2010-12-09 23:17
我比较支持 7楼 的说法。而且我敢肯定就是这么回事~~

哦,刚才没怎么看清楚。8楼 的只是解释的比较牵强,内存的样子倒是说对了。这个和进栈什么的没关系的。一个 int 就是4个字节也是一块进栈的。
内存字节序就是 intel 的是小尾端才会这样。

[ 本帖最后由 pangding 于 2010-12-9 23:21 编辑 ]
#10
南国利剑2010-12-10 01:12
7楼解释的简单明了。很好。

而8楼说的也没有错。只不过说的更接近底层硬件了。
8楼应该是搞嵌入式的吧?
#11
laoyang1032010-12-10 10:28
呵呵 版主大人我搞的是C++  比较低级的语言
用内存来解释C++问题   感觉应该更好一些
不想太高级了
#12
pangding2010-12-10 21:33
不过那个小尾端的字节序真的和栈没关系。
而且这种抽象的内存结构和具体的硬件关系其实也不是很大,南国利剑 要想学就是几分钟的事~~

不过扯这个和楼主的问题关系不大了,只要楼主能明白就行。
其实这个应该问问楼主他以为那个程序应该会输出什么,这样我们可以猜出他是怎么理解的,为什么会出错。
1