char类型在C或C++中占1个字节,在java中占2个字节。char用于C或C++中是定义字符型变量的,而char数据类型是一种整数类型,只会占据1个字节。而在java中char类型占2个字节是因为Java编译器默认使用Unicode编码,因此2字节(16位)可以表示所有字符。
本教程操作环境:windows7系统、Dell G3电脑。
我百度搜索“char占几个字节”,得到下面的答案:
char用于C或C++中定义字符型变量,是一种整数类型,只占一个字节,取值范围为 -128 ~ +127(-27~27-1)。
char类型占1字节,就是8位,所能存储的正整数是 0111 1111,即127。
显然这不是我们想要的结果,于是我继续搜索“java中的char占几个字节”
Java中的char用于存放字符的数据类型,占用2个字节,采用unicode编码,它的前128字节编码与ASCII兼容,只不过有些字符需要两个char来表示。
为什么C或C++和java中的char占用字节数不相同?
有些字符需要两个char来表示又是什么意思?
编码
在讨论这个问题之前,我们先对部分知识点做一下普及。
首先我们都知道计算机中储存的信息都是用二进制数表示的,那怎么样让计算机存储我们人类用的汉字或英文呢?
比如如何将'a'转换为二进制存储到计算机中,称为编码;
而将存储在计算机中的二进制数解析显示出来,称为解码。
字符集
字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、 GB18030字符集、Unicode字符集等。这是百度百科给的解释,反正就是字符集是一些字符的集合,字符集种类多,字符集中的字符数量也各不相同。计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。
unicode
它的名字叫统一码, 也叫万国码,符号数量在不断增加,已超百万 。
在创造Unicode之前,有数百种编码系统。没有一个编码可以包含足够的字符,从它的名字就可以看出这是一种所有符号的编码,每一个符号都给予一个独一无二的编码,那么各个不同编码导致的乱码问题就会消失。
大多数计算机采用ASCII码(美国标准信息交换码),它是表示所有大小写字母、数字、标点符号和控制字符的7位编码方案。统一码(Unicode)包含ASCII码,'\u0000'到'\u007F'对应全部128个ACSII字符。
不禁让我感慨,有实力的人才能制定标准。 Unicode 只是一个符号集,它只规定了符号的二进制代码,仅仅提供字符与编号间映射,却没有规定这个二进制代码应该如何存储。 我们知道英文字母的编号特别小,用一个字节就完全能够表示,而unicode中的中文符号的编号就很大了,一个字节根本不行。 于是后面出现了unicode字符存储的多种实现方式,比如UTF-8,UTF-16等。 UTF-8 是在互联网上使用最广的一种 Unicode 的实现方式。
内码和外码
我们常说的java中的char占几个字节,应该是java中内码中的char。
内码是指java运行时,其char和string在内存中的编码方式;外码是程序与外部交互时外部使用的字符编码,比如序列化技术。 外码可以理解为:只要不是内码,那就是外码。 要注意的是,源代码编译产生的目标代码文件(可执行文件或class文件)中的编码方式属于外码。 JVM中内码采用UTF16。 UTF-16 的 16 指的就是最小为 16 位一个单元,也即两字节为一个单元。早期,UTF16采用固定长度2字节的方式编码,两个字节可以表示65536种符号(其实真正能表示要比这个少),足以表示当时unicode中所有字符。但是随着unicode中字符的增加,2个字节无法表示所有的字符,UTF16采用了2字节或4字节的方式来完成编码。Java为应对这种情况,考虑到向前兼容的要求,Java用一对char来表示那些需要4字节的字符。所以,java中的char是占用两个字节,只不过有些字符需要两个char来表示。 这里就解释了为什么有些字符需要两个char来表示的问题。
另外:Java的class文件采用UTF8来存储字符,也就是说,class中字符占1~6个字节。 Java序列化时,字符也采用UTF8编码,占1~6个字符。
length()
那再来一个问题:Java中的一个字符的String.length()是多少?
看过前面的知识点不能再张嘴就来回答是1吧...... 写个demo看一下:虎年就用虎来测试吧,tigerUTF对对应unicode编码表示。
String tiger = "?"; String tigerUTF = "\uD83D\uDC05"; System.out.println(tigerUTF); System.out.println(tiger.length()); System.out.println(tiger.codePointCount(0,tiger.length()));
可以得出调用String.length()
得到的结果为2,表示的是stirng的char数组占UTF-16格式的2个代码单元(即4个字节),而不是有多少个字符。 当然我们想要获取多少个字符,可以使用codePointCount
方法来获取。
更多相关知识,请访问常见问题栏目!
以上是char类型要占几个字节的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

记事本++7.3.1
好用且免费的代码编辑器