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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© NNERO 中级黑马   /  2014-4-17 16:08  /  1655 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 NNERO 于 2014-4-17 17:27 编辑
  1. public class Text {

  2.         public static void main(String[] args) throws Exception{

  3.                 byte x = 'x';//byte 到底装的是什么?
  4.                 int y = 'x';
  5.                 char z = 'x';
  6.                 System.out.println(x);//打印结果:120
  7.                 System.out.println(y);//打印结果:120
  8.                 System.out.println(z);//打印结果:x

  9.         }

  10. }
复制代码
如代码所示,我用byte,int,char都分别赋值‘x',然后byte和int打印结果相同,char则打印字符
问题是:
byte类型到底是什么类型,里面装的其实就是整数?
char类型其实装的也是整数,但打印的时候自动转字符?
有些乱 这几个概念。。 求解答

6 个回复

倒序浏览
本帖最后由 kuroro自走核炮 于 2014-4-17 16:25 编辑

这三种类型在内存中实际的样子:
byte:01111000
int:00000000-00000000-00000000-01111000
char:00000000-01111000
byte和int打印时候实际上是转换成了十进制打印。
char则是用了unicode编码进行查找一个对应具体字符。
U+0061a拉丁字母 a
U+0062b拉丁字母 b
U+0063c拉丁字母 c
U+0064d拉丁字母 d
U+0065e拉丁字母 e
U+0066f拉丁字母 f
U+0067g拉丁字母 g
U+0068h拉丁字母 h
U+0069i拉丁字母 i
U+006Aj拉丁字母 j
U+006Bk拉丁字母 k
U+006Cl拉丁字母 l(L的小写
U+006Dm拉丁字母 m
U+006En拉丁字母 n
U+006Fo拉丁字母 o
U+0070p拉丁字母 p
U+0071q拉丁字母 q
U+0072r拉丁字母 r
U+0073s拉丁字母 s
U+0074t拉丁字母 t
U+0075u拉丁字母 u
U+0076v拉丁字母 v
U+0077w拉丁字母 w
U+0078x拉丁字母 x
U+0079y拉丁字母 y
这个是部分编码表,第一列用的是16进制。你可以自己换算下16进制78跟十进制的120以及二进制的1111000是不是一样。
回复 使用道具 举报 0 1
1 ,int  这种情况会将字符x的ASCII编码值也就是整数赋值给y。所以输出120.
2 ,你看到它是byte 实际是java底层是按照int存储的。   也120。
3  你存储的char是字符类型不加单引号的x就输出int了。   
回复 使用道具 举报
本帖最后由 ⒈心只霸占沵 于 2014-4-17 16:33 编辑

byte int 都属于整型  只是大小范围不同
  byte是8个bit  就是0000-00001 这表示1
  int   是32个bit 就是0000-0000-0000-0000 这表示1
char 对应的是ASCII码  它是字符类型,如果你 用 z+1  就会把char类型提升,把char在ASCII中对应的值拿出来跟1相加,比如说'a'+1=98  因为a在ASCII中对应的编号是97所以会用97+1


所以  byte x='x';把'x'对应的ASCII码提升为了byte类型数值,所以打印的是byte类型的数值
         int  y='x';同理
         char z='x';没有被提升,所以原样打印
回复 使用道具 举报
在Java中默认的整数类型是int,short、byte和char在运算时都会自动提升为int类型。
int、short、byte是整型数据,是有符号的
char是字符型数据,是无符号的。
char类型是不能自动转换为byte和short类型的。
在你程序中,'x'是字面值,实际上是个无符号整数值。
byte x = 'x';//在这里实际上是'x'先转换成int型,然后再转换给byte型。
若你定义 byte  b = z;编译器就会提示你要进行类型转换。
像字面值如112,'x'等,赋值给byte、short类型时,只要不超出范围,是会自动向定义的类型进行转换的。
回复 使用道具 举报
本帖最后由 伍叶竹 于 2014-4-17 16:40 编辑

一点想法:byte   的取值范围:-128 --- 127;
最大值:127     即2的7次方减去1;
最小值:-128   即-2的7次方;
=============================
short    int   long
short 作为16位有符号整形,int作为32位有符号整形,  long 作为64位有符号整形 都可以如上计算出 取值范围。其实也就是范围的问题。其他的楼上几个说的蛮清楚了。
char是16位无符号整形 。是整形存放的,,存放的是它的ASCII码值,也是整形计算。

回复 使用道具 举报
NNERO 中级黑马 2014-4-17 17:26:44
7#
综合各位的解答,我已经理解了,OK
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马