C++ 中文存储问题:char 如何存放中文?

飞天狐213 2015-01-03 06:53:31
一个char只占一个字节,最多只能存放255个字符,那么我想问它是如何存放中文字符的?

一下是我的测试程序:
char a = '中';
char b = '华';
char aa[] = "中华";
cout << sizeof aa << endl;//5
cout << sizeof a << endl; //1
cout << sizeof b << endl; //1

请问为什么单独存放一个中文占一个字符(a、b)但是一个中文字符放在数组中的时候就占用两个字符呢?
究竟内部是如何对待中文字符的?
...全文
11145 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Helen_Yrh 2017-07-27
  • 打赏
  • 举报
回复
引用 10 楼 michael2988 的回复:
一个中文字占两个字节。 char a = '中'; char b = '华'; char aa[] = "中华"; a, b 都不能完整地保存这两个中文字,会截断。 aa 会有4个有效字符吧。
想问可以修改中文占的字节吗?使用UTF-8这种,可以让文字占3个字节的,
赵4老师 2015-01-05
  • 打赏
  • 举报
回复 2
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
michael2988 2015-01-04
  • 打赏
  • 举报
回复
一个中文字占两个字节。 char a = '中'; char b = '华'; char aa[] = "中华"; a, b 都不能完整地保存这两个中文字,会截断。 aa 会有4个有效字符吧。
赵4老师 2015-01-04
  • 打赏
  • 举报
回复 2
电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A
飞天狐213 2015-01-04
  • 打赏
  • 举报
回复
引用 2 楼 Evankaka 的回复:
因为a.b本来就是单个char,一个字节,你就算给它赋中文,也会被截断, 中文放在字符数组里,它就会自动把数据2个字节都存下去啊。 2楼是个方法,你也可以用string..
明白。
飞天狐213 2015-01-04
  • 打赏
  • 举报
回复
引用 7 楼 CharlesSimonyi 的回复:
cout << a << endl; 你输出一下看看还能不能正常输出。。
#include<iostream> using namespace std; int main() { char a = '中'; char b = '文'; cout << a << b << endl; system("pause"); } 程序输出了:心。现在明白了,谢谢。
fly_dragon_fly 2015-01-03
  • 打赏
  • 举报
回复
一个字节不够就用2个或以上了
encoderlee 版主 2015-01-03
  • 打赏
  • 举报
回复 1
cout << a << endl; 你输出一下看看还能不能正常输出。。
jacksonfan 2015-01-03
  • 打赏
  • 举报
回复
char字符只能存放一个字节,char*和char[]是可以存放多个字节数据 一个char只占一个字节,最多只能存放255个字符。这句话前面是对的,后半句错了,只能存放一个字符。
skyabc 2015-01-03
  • 打赏
  • 举报
回复
中文占两个字节,两个字节经过算法获得一个索引号从字库取得汉字,如何算法取决你的编码方案
zhuyf87 2015-01-03
  • 打赏
  • 举报
回复
是截断了,编译的时候会有类似的warning: warning C4305: “初始化”: 从“int”到“char”截断
zhuyf87 2015-01-03
  • 打赏
  • 举报
回复
char a = '中';
char b = '华';
应该已经越界了吧。
Evankaka 版主 2015-01-03
  • 打赏
  • 举报
回复
因为a.b本来就是单个char,一个字节,你就算给它赋中文,也会被截断, 中文放在字符数组里,它就会自动把数据2个字节都存下去啊。 2楼是个方法,你也可以用string..
瑞卡哥哥 2015-01-03
  • 打赏
  • 举报
回复
w_char

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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