近日在学习C语言字符串的知识时,对汉字在内存中的存储方式有了一些进一步的认识,下面整理了一下探索的结果。
char s[] = "你";
printf("%d\n",strlen(s));
printf("%hhd %hhd\n",s[0],s[1]); // %hhd可简单理解为以signed char格式输出
//结果显示为
2
-60 -29
第一行输出:结果为2,表明"你"是以gbk格式存储的,若结果为3,则说明是以utf-8格式存储的。
第二行输出:由于整数在内存当中是以补码形式存储,而-60和-29对应的补码分别为11000100和11100011,故存储在s[0]和s[1]位置上的内容即为11000100 11100011,换算成十六进制即为0xc4 0xe3,查找"你"所对应的gbk编码,恰为0xc4e3。(关于原码补码反码的具体知识,详见此处)
故内存中的"你"就是占据两个字节的"11000100 11100011" 。
注意:
printf("%hhd %hhd\n",s[0],s[1]);
不能写成
printf("%x %x\n",s[0],s[1]);
因为如果写成%x,那么printf函数将把s[0],s[1]看作是int类型的数,而int类型所占的字节数并不是1,因此这样输出来的数并不是s[0]和s[1]本身所代表的数。