A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 待解封的小刀 中级黑马   /  2014-6-29 07:29  /  1529 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

各位大神 弱弱的问一句
视频上说字符型数据是两个8位  占2字节
那就是‘a'占两字节
但是我学习C的时候  老师都说这个’a‘是一个字节啊  
求解答啊 !1!

10 个回复

倒序浏览
java的变量类型和C的变量类型各自在内存中占的大小不一样,C是面向过程的开发语言,java是面向对象的语言。可能是java开发者在创建java语言是就把char定位2个字节
回复 使用道具 举报
坤儿 发表于 2014-6-29 09:23
java的变量类型和C的变量类型各自在内存中占的大小不一样,C是面向过程的开发语言,java是面向对象的语言。 ...

也就是说我们学java中,字符都按2个字节算吗?‘a’也就是占2个字节了  是这个意思吗?
回复 使用道具 举报
待解封的小刀 发表于 2014-6-29 10:01
也就是说我们学java中,字符都按2个字节算吗?‘a’也就是占2个字节了  是这个意思吗?
...

对   我面试也遇到过类似的问题 ,问:java中一个char 能表示一个汉字吗?  答案是能 因为一个char占2个字节
一个汉字也是2个字节
回复 使用道具 举报
坤儿 发表于 2014-6-29 10:04
对   我面试也遇到过类似的问题 ,问:java中一个char 能表示一个汉字吗?  答案是能 因为一个char占2个 ...

亲 对于这个char  我很迷惑啊。
System.out.println((char)'a');打出来是a
System.out.println('a');这个也是a
System.out.println('a'+0);这个是97
System.out.println((char)('a'+0));这个还是a
这几个把我搞糊涂了。这4个到底分别表示的是什么啊?怎么分析的啊 求指点啊
回复 使用道具 举报
Java跟c不同啊
回复 使用道具 举报
少年,又看到你了。猿粪{:3_62:}啊~对于这个char,我还是帮你解决一下吧。
char 字符类型的的确确就是占用内存空间2bit;'a'、'b'、'c'...都是占用内存空间1bit,这个不管是c还是java都一样,这个没有另作规定。自个敲个代码论证一下吧,少年,事实胜于雄辩啊(老朽,已尽力。。。{:3_49:})
回复 使用道具 举报
⋛⋌⋚JEEP 发表于 2014-6-29 23:20
少年,又看到你了。猿粪啊~对于这个char,我还是帮你解决一下吧。
char 字符类型的的确确就是占用内 ...

大神啊  我看了毕向东的java基础视频啊  在他的第二天的08  类型转换  16:23s 的时候  说了这么  一句话  字符'a'  占两个字节 。。。。亲  这个怎么解释
回复 使用道具 举报
待解封的小刀 发表于 2014-6-30 07:55
大神啊  我看了毕向东的java基础视频啊  在他的第二天的08  类型转换  16:23s 的时候  说了这么  一句话  ...

毕姥爷没说错,但是前提条件是JVM默认的编码规则。需要声明变量类型,如char b ='a'。
     我具体说说编码规则对字符占用计算机内存空间的一些影响吧。
     一般我们java开发用的jdk中JVM统一使用字符编码规则是UTF—16(Unicode)编码表。所以每次我们声明变量为char类型时候,JVM默认就是2字节。而实际操作时,如果没有声明char类型,一般就会以我们的windows操作系统使用的编码规则为主,表示为:汉字一般是用GBK编码表表示(1个汉字就是2个字节),英文字母一般是用ASCII编码表表示(1个英文字母就是1个字节,ASCII编码表只使用了7个二进制位表示ASCII码值0~255的字符,超出要用别的编码规则)。
      对于英文字母的实际占用内存空间确实只有1个字节,至于说2个字节的,完全是编码规则影响,
比如JVM中的UTF-16,对于英文字母在二进制中的高八位是以补0后才有占用2个字节的内存空间的说法。
      下面以代码演示一遍:
  1. 1、
  2. import java.lang.*;
  3. class Test6{
  4.         public static void main(String[] args){
  5.                 //这里int类型改成byte类型,就可以看到,实际中,
  6.                                        英文字母只需要1 个字节的内存空间,使用的就是ASCII码表的规则。
  7.                                      int c = 'a'+0;
  8.                 System.out.println(c);//输出结果为97。
  9.                 System.out.println(Integer.toBinaryString(c));}}
  10.                              //十进制转换二进制数输出,结果为:1100001  ,可以看出只要1个字节内存空间即可。

  11. 2、
  12. import java.lang.*;
  13. class Test7{
  14.         public static void main(String[] args){
  15.                 //这里改成byte类型,明显是损失精度,原因中文汉字是2个字节,
  16.                                        使用的规则是Windows的GBK编码表的规则。
  17.                                      int c = '马'+0;
  18.                 System.out.println(c);//输出结果为39532。
  19.                 System.out.println(Integer.toBinaryString(c));}}
  20.            //十进制转换二进制数输出,结果为:1001101001101100  ,可以看出只要2个字节内存空间即可。


  21. 3、
  22. import java.lang.*;
  23. class Test8{
  24.         public static void main(String[] args){
  25.                 char b ='a';//声明变量b为char类型。
  26.                 int c = b+0;
  27.                             //这里改成byte类型结果也是损失精度。
  28.                                原因char类型是占用2个字节内存空间,JVM默认的编码规则为UTF-16。
  29.                 System.out.println(c);//输出结果为97。
  30.                 System.out.println(Integer.toBinaryString(c));}}
  31. //十进制转换二进制数输出,结果为:1100001  ,可以看出只要1个字节内存空间即可,实际为2个字节,高八位补0。
复制代码
   
(你只要了解就可以了,不必太纠结这个char类型和英文字母内存问题,加油吧!少年!)
如有疑问可查询:帮助资料地址: http://hi.baidu.com/leifenglian/item/7e25a9194da0e7751009b5e8
回复 使用道具 举报
⋛⋌⋚JEEP 发表于 2014-6-30 13:28
毕姥爷没说错,但是前提条件是JVM默认的编码规则。需要声明变量类型,如char b ='a'。
     我具体说说编 ...

谢谢了大神。。。我会加油的
回复 使用道具 举报
待解封的小刀 发表于 2014-6-30 14:31
谢谢了大神。。。我会加油的

少年,给你个建议吧,以后有问题可以去最新区发帖吧,老区版主不一定能及时处理帮你分类和加分的。另外看看版规,给你个链接,自个了解一下{:3_57:}
http://bbs.itheima.com/forum.php?mod=viewthread&tid=40602
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马