网站seo优化的重要性,企业网站 需求,网站开发经验总结与教训,wordpress 分类导航插件文章目录 遇到的问题正确解答拓展参考文章 遇到的问题
首次遇到下面的代码时#xff0c;感觉应该输出65,323。深入理解union的存储之后发现正确答案是#xff1a;67,323.
union
{char c;int i;
} u;
int main(){u.c A;u.i 0x143;printf(%d,%d\n, u.c, u.i);
… 文章目录 遇到的问题正确解答拓展参考文章 遇到的问题
首次遇到下面的代码时感觉应该输出65,323。深入理解union的存储之后发现正确答案是67,323.
union
{char c;int i;
} u;
int main(){u.c A;u.i 0x143;printf(%d,%d\n, u.c, u.i);
}正确解答
对union首先明确几点
union共用存储空间后赋值的数据会将前面赋值的进行覆盖。存储时要求高地址在后地址值在后。存储空间大小为共用体成员中长度最长的成员的size。
上例可知共用体u中有两个成员i和c分别占用4个字节和2个字节故u占用4个字节。 首先将A存入u中字符A对应二进制为01000001。存储如下图所示 再将十六进制143存储u该数对应二进制101000011。存储如下图所示 后面的0x143将第一次存储的A覆盖当输出u.c是则会输出01000011对应的十进制67输出u.i为0x143对应的十进制323.
拓展
值得注意的是当共用体中含有数组元素时重复的赋值则不会被覆盖应为不同的数组元素对应不同的地址如下例所示。
union
{int i;char x[2];
} a;
int main()
{a.x[0] 10;a.x[1] 1;printf(%d\n, a.i);return 0;
}10对应二进制00001010 1对应二进制00000001 存放方式 计算所得值 i 2^8 2^3 2^1 256 8 2 266
参考文章
1 2