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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄或俊 中级黑马   /  2012-4-19 10:55  /  2835 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class CeShi
  2. {
  3.     static public void main(String[] args)
  4.     {
  5.     short s1=5;
  6.     short s2=6;
  7.     short s;
  8.     s=s1+s2;
  9.     System.out.println(s); //报错,这是为什么呢!!!

  10.     int i1=Integer.MAX_VALUE;
  11.     int i2=Integer.MAX_VALUE;
  12.     int i;
  13.     i=i1+i2;
  14.     System.out.println(i); //为啥又不报错了呢!!!
  15.     }
  16. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

13 个回复

倒序浏览
主要就是为什么byte、short类型的会有损失精度——超出范围
为什么int类型的就不会超出范围呢!难道就是因为int范围比较大,但是再大也有超出范围的时候呀!~
回复 使用道具 举报
shor char byte进行算术运行时结果为int型 s=(sort)(s1+s2) 这样就不报错了 i=i1+i2; int型跟int型以下的算术运行结果为int型所以不报错

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
i=i1+i2; i1+i2结果超出int类型的长度 所以取该数的2进制低32位赋值给变量i
回复 使用道具 举报
package cn.text;

class CeShi
{
    static public void main(String[] args)

    {

    short s1=5;

    short s2=6;

    short s;
    //int s;把此改为int型

    s=(short) (s1+s2);//强制转为(short)类型
    //s=(s1+s2);

    System.out.println(s);


    int i1=Integer.MAX_VALUE;

    int i2=Integer.MAX_VALUE;

    int i;

    i=i1+i2;

    System.out.println(i); //为啥又不报错了呢!!!

    }

}
回复 使用道具 举报
本帖最后由 邱俊杰 于 2012-4-19 11:16 编辑

    short s1=5;
    short s2=6;
    short s;
    s=s1+s2;    //  这里其实是   5+6=11, 是一个int  类型的、这里是需要强制转换类型的的  s=(short)s1+s2
  
    int i1=Integer.MAX_VALUE;
    int i2=Integer.MAX_VALUE;
    int i;
    i=i1+i2;
    System.out.println(i); // 两个int最大值相加应该超出int范围了的、 这里的结果居然是-2 ,我不能理解
回复 使用道具 举报
基本数据类型变量:char,byte,short,int,long,float,double;char和byte在定义变量时会在内存中开辟一个字节的空间;short是两个字节;int和float是四个字节;long在以前有的软件是四个字节,现在应该是八个字节,double也是八个字节;
在定义整型变量时默认是int型;而java是强类型语言,所以你定义的变量类型为short时会报错的,short s1=5;这句话是将整型变量类型降级了。5默认是四个字节你用两个字节的装,会出现可能丢失精度的情况;所以在s=s1+s2;这句话要强转一下;s=(short)s1+s2;
还有楼主说的溢出的问题,一般的数值int足够了,范围-65536~65535;除非要一些天文数字就要定义long了;
回复 使用道具 举报
这是一个自动类型转换的问题,byte、short、char类型的数据进行运算的时候,会先转换成int类型,然后在进行运算

回复 使用道具 举报
zhaishuang 发表于 2012-4-19 11:20
基本数据类型变量:char,byte,short,int,long,float,double;char和byte在定义变量时会在内存中开辟一个字 ...

补充一下:char应该是两个字节 char='我'; OK的!
然后就是:
short s1=5;
short s2=6;
我已经将5定义成short类型了
为什么在内存中又变成int类型了呢!~
【short、char、byte进行算术运行时结果为int型,啥意思呀!~】
看到这里我又写了一些代码,请求大伙解释解释:
  1. char a='1';
  2. char b='2';
  3. int i=a+b;
  4. char c=a+b;
  5. char c1=a+'0';
  6. char c2='3'+'4';
  7. System.out.println(i);
  8. System.out.println(c);
  9. System.out.println(c1);
  10. System.out.println(c2);
  11. System.out.println(a+b);
  12. System.out.println('0'+a);
  13. //因为char a='1'; 是字符1,而字符1对应的ASCII码表是:49
复制代码
回复 使用道具 举报
short、char、byte 数据类型可以直接赋值只要赋值的数不超过其表示的范围,就不会出去。为什么楼主的报错呢?是因为short、char、byte 数据类型在做算术运算时,JVM自动把其转化为int型再计算。s=s1+s2;  右边是int型,而左边是short型 所以会报错的。第二个报错是损失精度,int型表示不了那么大的数!!
  1. class CeShi
  2. {
  3.     static public void main(String[] args)
  4.     {
  5.     short s1=5;
  6.     short s2=6;
  7.     short s;
  8.     s=s1+s2;
  9.     System.out.println(s); //报错,这是为什么呢!!!

  10.     int i1=Integer.MAX_VALUE;
  11.     int i2=Integer.MAX_VALUE;
  12.     int i;
  13.     i=i1+i2;
  14.     System.out.println(i); //为啥又不报错了呢!!!
  15.     }
  16. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
黄或俊 发表于 2012-4-19 13:34
补充一下:char应该是两个字节 char='我'; OK的!
然后就是:
short s1=5;

呵呵,不好意思。这个小知识点我老是忽略
回复 使用道具 举报
黄或俊 发表于 2012-4-19 13:34
补充一下:char应该是两个字节 char='我'; OK的!
然后就是:
short s1=5;

呵呵,不好意思。这个小知识点我老是忽略
回复 使用道具 举报
余耀明 发表于 2012-4-19 13:54
short、char、byte 数据类型可以直接赋值只要赋值的数不超过其表示的范围,就不会出去。为什么楼主的报错呢 ...

最关键点就是第二个没有报错呀!~你运行以下试试看
回复 使用道具 举报
char a='1';
char b='2';
int i=a+b;                          a+b结果为int型在内存中占有4个字节 char只钻用2个字节所以应该是
char c=a+b;
char c1=a+'0';                        char c=(char)(a+b)
char c2='3'+'4';                char c1=(char)(a+'0');       
System.out.println(i);                char c2=(char)('3'+'4');
System.out.println(c);
System.out.println(c1);
System.out.println(c2);
System.out.println(a+b);
System.out.println('0'+a);
//因为char a='1'; 是字符1,而字符1对应的ASCII码表是:49

【short、char、byte进行算术运行时结果为int型,啥意思呀!~】
这是java的竞升语法 必须遵守 低于int型的类型( byte sort char 应为它们在内存中占的位比int型少分别为 8 16 16 32)进行运算结果为int型
int型最大值为2147483647 当1个long类型的1+上该值赋给int 的sum会是什么情况了
Long sun=2147483647+1; 结果并不是2147483648  而是-2147483648
计算机底层只认识0和1即2进制并不认识其他进制  所以任何算术运算底层都是已数字的2进制进行的
long sun=2147483647+1 为0111-1111 1111-1111 1111-1111 1111-1111 +0000-0000 0000-0000 0000-0000 0000-0001=
1000-0000 0000-0000 0000-0000 1000-0000  而2进制最高位代表符号位  该值是负数-2147483648的机器码
而long sum=2147483647+1L; 结果为2147483648; 应为它们的结果为long型专业64位  在内存中的源码为
0000-0000 0000-0000 0000-0000 1000-0000 1000-0000 0000-0000 0000-0000 1000-0000
int i=a+b;当a+b的结果的2进制大于32位时 即溢出 但是JAVA是不会报错的允许溢出行为有结果 它会取a+b的结果的2进制的低32位赋值给变量i 所以2个正数相加结果有可能是负数  当然你也可以用个判断语句当发生溢出时异常抛出处理结果。。
如果是int sun=2147483647+1L; 又不结果为0000-0000 0000-0000 0000-0000 1000-0000 1000-0000 0000-0000 0000-0000 1000-0000
已溢出所以舍弃最高32为赋值给sum 所以值为1000-0000 1000-0000 0000-0000 0000-0000 1000-0000   -2147483648
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马