C语言汉字在内存中如何存储

近日在学习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]本身所代表的数。

  • 9
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值