发现题目
复习C语言的时候,发现一个很有意思的题目;
int main() { union { char i[4]; int k; } r; r.i[0] = 2; r.i[1] = 0; r.i[2] = 0; r.i[3] = 0; printf("%d \n", r.k); }
自以为是答案是:8,run后发现答案是:2
解题详解
其实命题人是考一个int类型的数据,在内存中是如何存储的。
例如:int类型的1在内存中占用4个字节,那这4个字节具体怎么存储呢?
目前市面上大部分书籍说的都是数字的字节表示形式,按照二进制的方式进行存储。我就理所当然的认为是按照下面方式进行存储的。
第1字节 第2字节 第3字节 第4字节
00000000 00000000 00000000 00000001
综合网上百度后,发现实际上并不是这样存储的,而是低位在前,高位在后的方式存储的,也就是按照下面的方式
第1字节 第2字节 第3字节 第4字节
00000001 00000000 00000000 00000000
觉得有点不太好理解,于是就写了一段小程序来检验一下,看看是否是我说的这种方式进行存储。
#include <stdio.h> int main(){ int i = 1; unsigned char * p = (unsigned char *)(&i); printf("第1字节:%d,第2字节:%d,第3字节:%d,第4字节:%d\n",*p,*(p+1),*(p+2),*(p+3)); }
output:第1字节:1,第2字节:0,第3字节:0,第4字节:0