C语言共用体问题

intmain(){unionb{intk;charc[2];}a;a.k=-7;printf("%d,%d\n",a.c[0],a.c[1]);return0;}的结果... int main()
{
union b
{
int k;
char c[2];
}a;
a.k=-7;
printf("%d,%d\n",a.c[0],a.c[1]);
return 0;
}

的结果为什么是-7,-1 怎么想也想不到,希望高手指点!!!
展开
 我来答
kaixingui2012
2013-07-11 · TA获得超过4.2万个赞
知道大有可为答主
回答量:1.4万
采纳率:81%
帮助的人:6487万
展开全部
这与机器的大小端有关系,还与整数在内存中的存储形式有关
一、union中,各变量共用内存空间
二、小端机:低地址存数据的低位 (根据结果,可以看出你的机器是小端机)
三、a.k=-7 -7存储在计算机中用补码 两个字节下 -7的补码为11111111 11111001
四、低数位是指11111001 高数位是指11111111
五、在一个字节中, 11111111 表示-1 11111001表示-7 当然,这都补码
六、
c[0]是低地址位,所以c[0]中存的是11111001
c[1]是高地址位,所以c[1]中存的是11111111

所以,结果为 -7 -1
test_pop
2013-07-11 · TA获得超过376个赞
知道小有建树答主
回答量:332
采纳率:100%
帮助的人:241万
展开全部
共用体union的大小是哪个元素占用空间最大就是多大,这个共用体大小为int即4个字节。
a.k = -7;
负数在计算机中是以补码的形式存放的。
下面让我们来看看-7的补码是怎么得到的:
1.7的二进制为:(高位-低位)
0000 0000 0000 0000 0000 0000 0000 0111 (考虑到4个字节32位)
第4个字节 第3个字节 第2个字节 第一个字节
2.其反码为:
1111 1111 1111 1111 1111 1111 1111 1000
3.补码为反码+1,即:
1111 1111 1111 1111 1111 1111 1111 1001
所以:
a.c[0] = -7, a.c[1] = -1
-1在计算机的存放是:
1111 1111(仅写了一个字节)。
要是你定义char c[4];
那么a.c[2] = -1, a.c[3] = -1
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
windsonli2007
2013-07-11 · 超过23用户采纳过TA的回答
知道答主
回答量:86
采纳率:0%
帮助的人:57.7万
展开全部
k和c[2]是占用同一个空间的,
k=-7 = 11111111 11111001 B
c[1] c[0]

k是整型16位
c是字符8位
所以 c[1]=11111111B =-1
c[0] = 11111001B = -7
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
dsoyy
2013-07-11 · TA获得超过723个赞
知道小有建树答主
回答量:1054
采纳率:50%
帮助的人:559万
展开全部
-7,你能猜到。

-1,因为那部分内存空间未被赋值,因此什么结果都不足奇,没意义。
你 a.k=-7; 赋值,改成一个大数,如65530这样的数字,在体会一下
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-07-11
展开全部
#3 #2 #1 #0

+----+----+----+----+
| FF | FF| FF | F7|
+----+----+----+----+

k,与c[0],c[1]共用int空间,
c[0]对应字节#0
c[1]对应字节#1
-7在内存里表示为FF FF FF F7
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式