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 怎么想也想不到,希望高手指点!!! 展开
{
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 怎么想也想不到,希望高手指点!!! 展开
5个回答
展开全部
这与机器的大小端有关系,还与整数在内存中的存储形式有关
一、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
一、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
展开全部
共用体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
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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
k和c[2]是占用同一个空间的,
k=-7 = 11111111 11111001 B
c[1] c[0]
k是整型16位
c是字符8位
所以 c[1]=11111111B =-1
c[0] = 11111001B = -7
k=-7 = 11111111 11111001 B
c[1] c[0]
k是整型16位
c是字符8位
所以 c[1]=11111111B =-1
c[0] = 11111001B = -7
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
-7,你能猜到。
-1,因为那部分内存空间未被赋值,因此什么结果都不足奇,没意义。
你 a.k=-7; 赋值,改成一个大数,如65530这样的数字,在体会一下
-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
+----+----+----+----+
| FF | FF| FF | F7|
+----+----+----+----+
k,与c[0],c[1]共用int空间,
c[0]对应字节#0
c[1]对应字节#1
-7在内存里表示为FF FF FF F7
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询