这个C问题大家真正知道答案的我相信不多,我不知道!

yiruirui0507 2010-07-15 04:18:50
#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
char* str = "I 服了 You";

printf("%s\n", str);

return 0;
}

请问汉字是如何在内存中表示的,GBK?UNICODE?
我做了一个实验;
这样单独的输出每个数字;

int main()
{
char* str = "I 服了 You";
printf("%s\n", str);
for(int i=0; i<strlen(str); i++)
printf("%d\n",str[i]);
system("PAUSE");
return EXIT_SUCCESS;
}


结果为:
73
32
-73
-2
-63
-53
32
89
111
117
请问 -73和-2是则么来的?能讲清楚,加分!加分!!!
就这个简单代码我看了半天,查了好多资料也没完全明白过来,提供一些我的资料:
我查了GBK的编码,GBK的编码库BFFE对应的汉字是”服“字!
就这么多了,大家帮忙吧!
...全文
329 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
yiruirui0507 2010-07-16
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 guxin__qixue 的回复:]
引用 4 楼 benbshmily 的回复:
1.GBK编码的服是 0xB7FE
2.B7FE在内存里的表示是
高地址 FE B7 低地址。
你自己就可以算得出来了。FE就对应-2,B7就对应-73

汉字对应2个字节,输出时先输出低地址。空格也对应一个ACSII码
[/Quote]

敢问楼上玩真三的?犀利否?
guxin__qixue 2010-07-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 benbshmily 的回复:]
1.GBK编码的服是 0xB7FE
2.B7FE在内存里的表示是
高地址 FE B7 低地址。
你自己就可以算得出来了。FE就对应-2,B7就对应-73
[/Quote]
汉字对应2个字节,输出时先输出低地址。空格也对应一个ACSII码
blastorm 2010-07-16
  • 打赏
  • 举报
回复
I 服了 You
  • 打赏
  • 举报
回复
wchar 这个..
zdl110110 2010-07-16
  • 打赏
  • 举报
回复
收获不少
jbz001 2010-07-15
  • 打赏
  • 举报
回复
每个汉字占两个字节,你一个一个字节输出,汉字就会被拆分,显示的就不是正确的汉字编码了。
风子II 2010-07-15
  • 打赏
  • 举报
回复
汉字占两字节,高字节首位为1,因此是个负数
董小尾 2010-07-15
  • 打赏
  • 举报
回复
留意一下
zhangbohtz 2010-07-15
  • 打赏
  • 举报
回复
哈哈,受教了!
gundamy 2010-07-15
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分
G_Spider 2010-07-15
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 yiruirui0507 的回复:]
从内存中读取的问题解决了,操作系统是如何放到内存中的呢?愿闻其详!
[/Quote]

我们常用到的Fonts字体库吧,这个就是有着复杂定义格式的汉字库显示实体。正如我们知道了门牌号码比如机器码,然后定位到汉字库显示实体,再显示到显卡上(以象素的形式)
yiruirui0507 2010-07-15
  • 打赏
  • 举报
回复
从内存中读取的问题解决了,操作系统是如何放到内存中的呢?愿闻其详!
codesnail 2010-07-15
  • 打赏
  • 举报
回复
另外对于楼主的标题党式的提问方式有异议。
codesnail 2010-07-15
  • 打赏
  • 举报
回复
取决与编译器吧,当然一般是unicode,有的编译器不支持unicode。
G_Spider 2010-07-15
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 yiruirui0507 的回复:]
引用 9 楼 g_spider 的回复:
嘿嘿,怎么说你呢。是这样测的!
原理:

汉字的区位码算法:
((汉字的第一个字节-0xa1)*94+(汉字的第二个字节-0xa1))*32
区码=汉字的机器码高字节-A0
位码=汉字的机器码的低字节-A0
汉字文本文件读出的就是汉字的机器吗(用C语言或VB都能实现),两个字节
代表一个字的机器吗,高位在前,低位在后
如"啊"的区位码为……
[/Quote]

这个只有你用过像HZK16这样的汉字点阵库才能真正体会区位码的真正内涵.

sky198306 2010-07-15
  • 打赏
  • 举报
回复
呵呵学习之,研究汉字
yiruirui0507 2010-07-15
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 baihacker 的回复:]
http://www.cnblogs.com/fuyingke/archive/2007/12/11/990112.html

运行时的看这篇。
[/Quote]

这文章真长,比万里长城还要长!不过很多有用!
yiruirui0507 2010-07-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 g_spider 的回复:]
嘿嘿,怎么说你呢。是这样测的!
原理:

汉字的区位码算法:
((汉字的第一个字节-0xa1)*94+(汉字的第二个字节-0xa1))*32
区码=汉字的机器码高字节-A0
位码=汉字的机器码的低字节-A0
汉字文本文件读出的就是汉字的机器吗(用C语言或VB都能实现),两个字节
代表一个字的机器吗,高位在前,低位在后
如"啊"的区位码为1601,机器码为B0A1(1……
[/Quote]
那汉字的存储只跟机器码有关系了,跟区位码 没关系了?我看你只说了机器码!弃区位码与不顾?
algorithms_memo 2010-07-15
  • 打赏
  • 举报
回复

char* str = "I 服了 You";

GBK(GB2312)编码,从第三个至第六个是中文,C/C++索引从2到5。因此为:
-73,-2,-63,-53
转换成16进制表示:
B7,FE,C1,CB
每两个字符表示一个汉字,Intel处理器下为小端字节存储,因此实际为:
FEB7,CBC1
对应GBK编码表正好是“服了”。
至于楼主说的:

GBK的编码库BFFE对应的汉字是”服“字!

要么看错了,要么你的GBK表有问题。
cattycat 2010-07-15
  • 打赏
  • 举报
回复
ansi编码中文是gb2312的,而且是两个字节,每个字节都是大于0x80的,如果你输出的话必须用unsigned char才不会出现负数。
加载更多回复(11)

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧