这个问题源自某讨论课题,闲话少说,直接上代码:
#include<stdio.h>
int main(int argc, char** argv) {
int a[] = {('l'<<24) + ('l'<<16) + ('e'<<8) + 'h', 'o'};
printf("%x%x\n", a[0], a[1]);
puts((char*)a);
return 0;
}
输出结果为:
6c6c65686f
hello
这个代码十分简单,就是在测试c标准对一些“神奇”的操作的默认做法以及机器内存存储方式。这里疑点最大的为数组a,为什么会是‘l’‘l’‘e’‘h’‘o’呢?分析一下:
1. 字符在进行数值运算时将会转化为int,这点可以通过sizeof('c'-'a')来验证。(因此这里不会出现这样的warning: left shift count >= width of type [-Wshift-count-overflow])
2. 可以发现a此时在内存中的呈现(这里用assic字符代替对应的数值,也就是'l' = 0x6c、'e' = 0x65)为:
上为高地址
\0 -------
\0