有知道下面这个程序为什么输出13吗?
#include <stdio.h>
union pw
{
int i;
char ch[2];
}a;
void main() {
a.ch[0] = 13;
a.ch[1] = 0;
printf("%d\n", a.i);
}
有知道下面这个程序为什么输出13吗?
#include <stdio.h>
union pw
{
int i;
char ch[2];
}a;
void main() {
a.ch[0] = 13;
a.ch[1] = 0;
printf("%d\n", a.i);
}
Union是联合体,表示i和ch共用一段内存空间,当通过联合体调用i时,将字节解释为int,否则解释为char数组。int共4字节,一个char一字节,2个char的数组共2字节,所以联合体pw共占用4字节
main函数中13占用了整个空间的第一个字节,0占用第二个字节,剩下2个字节默认为0
a的内存空间分配如下
|地址|&a|&a+1|&a+2|&a+3|
|数据|13|0|0|0|
一般来说机器都是小端法储存数字,即低位字节存在前面(低地址),高位字节存在后面(高地址)
所以a.i得到的整数是0 0 0 13这些二进制位拼接成的整数13,所以返回13
再举个栗子,当你main函数中的代码换成a.ch[1]=13时
a的内存空间分配如下
|地址|&a|&a+1|&a+2|&a+3|
|数据|0|13|0|0|
所以此时调用a.i就是0 0 13 0的二进制位拼接成的整数,相当于13左移8位(即乘2的8次幂256),结果是3328