有趣的问题~~~ 基础好的进来看看~~ 呵呵~~~

r_swordsman 2004-12-23 10:52:38
#include <iostream.h>

union _un
{
struct _st
{
int a;
char b[28];

}st;
char *s;
} un;

void main()
{
char c;
strcpy(un.st.b, "abcd");
un.st.a = 0x41; // 0x41 = 'A'
cout << (char*)&un << endl;
un.st.a = 0x4142;
cout << (char*)&un << endl;
un.st.a = 0x414243;
cout << (char*)&un << endl;
un.st.a = 0x41424344;
cout << (char*)&un << endl;
un.st.a = 0x4142434445;
cout << (char*)&un << endl;
cin >> c;
}

// 呵呵~~ 大家知道运行的结果么??? 知道为什么吗??????
...全文
262 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
tysoccer 2004-12-24
  • 打赏
  • 举报
回复
挺有意思
r_swordsman 2004-12-24
  • 打赏
  • 举报
回复
楼上两位~~~char *s;有什么问题么???
ppqi 2004-12-24
  • 打赏
  • 举报
回复
char *s;
睡在床板下_ 2004-12-23
  • 打赏
  • 举报
回复
恩~~ 是的啊~~ 楼上楼上的 对, 我自己也试了试,
对地址的 了解~~
cizi_nwu 2004-12-23
  • 打赏
  • 举报
回复
嗯,就像 wd_wonder(奇迹)所说的那样,因为输出(char*)……遇到0就停止!
呵呵,明白了!
wd_wonder 2004-12-23
  • 打赏
  • 举报
回复
这个问题很简单啦,因为intel系列的整型数据的存储是高位在后,低位在前,所以当给un.st.a=0x41时,整个un为(按字节16进制):41 00 00 00 61 62 63 64,在遇到第一个00时就认为是字符串的结束符了,自然输出为A;当给un.st.a=0x41424344时,整个un为:44 43 42 41 61 62 63 64 自然就是
DCBAabcd了
cizi_nwu 2004-12-23
  • 打赏
  • 举报
回复
呵呵,明白了,忽略了strcpy(un.st.b, "abcd");
cizi_nwu 2004-12-23
  • 打赏
  • 举报
回复
我的结果是:
A
BA
CBA
DCBAabcd

有一个我注释掉了,因为0x4142434445超出了int值。
不太明白最后一个DCBAabcd是怎么回事……
mujc1111 2004-12-23
  • 打赏
  • 举报
回复
看汇编书
intel处理器采用little-endian寻址
Cooboob 2004-12-23
  • 打赏
  • 举报
回复
我在vc++6.0下 无法编译通过
sunlu_eric 2004-12-23
  • 打赏
  • 举报
回复
char *s;
还有这个那,上面的没有这个有意思!!!
r_swordsman 2004-12-23
  • 打赏
  • 举报
回复
wd_wonder(奇迹) 说的不错喔~~~
cizi_nwu(cizi) 的结果也正确~~但是说因为0x4142434445超出了int值~~而不知道结果~~
那结果就是"EDCBabcd"~~~因为0x41被抛弃~~但不会出错~~~

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧