1. byte b1=(int)1;
2. byte b2 =1;
3. byte b3 =b1+b2;
4. byte b4 =1+1;
第一行和第四行为什么编译可以通过?
2. byte b2 =1;
3. byte b3 =b1+b2;
4. byte b4 =1+1;
第一行和第四行为什么编译可以通过?
解决方案 »
- 现在编写Swing都用写什么可视化工具?
- JPanel显示不出来,大虾请帮忙!先谢了!
- java实现的数据结构很难懂呀?
- 关于线程的问题,大家来帮忙啊!
- 关于JDK1.5使用stringbuffer的连续append的问题
- 在把这道题送给大家 也是渥太华大学的 帮忙解决以下八
- 关于JComboBox的一个奇怪的问题(今天要解决,在线等待)
- 关于package的问题
- 请问 用JBuidler 6 怎么能生成执行文件!!谢谢
- 写一个方法,向它传递一个对象,循环打印出对象层次结构中的所有类?thinking in java里面的一个习题不知道如何做请教高手?
- 想学JAVA各位高手指点下应该看什么书?
- 关于表格鼠标事件
2. byte b2 =1; --->默认的1应该是int型的 byte怎么定义 你应该知道吧 呵呵
3. byte b3 =b1+b2; --->因为b2不是int型的 得转换
4. byte b4 =1+1; --->1是int型的 执行了+运算 转换成了int型了
byte-->int(强制转换)
第四行也应该报同样的错呀???
package test;public class test{
public static void main(String args[]){
byte b1 = (int)1;
byte b2 = 1;
// byte b3 = b1 + b2;
byte b4 = 1 + 1;
int a = 1;
System.out.println("b1=" + b1 + " b2=" + b2 + " b4=" + b4);
System.out.println("b1=" + TypeTest.getType(b1) + " b2=" + TypeTest.getType(b2) +
" b4=" + TypeTest.getType(b4) + " a=" + TypeTest.getType(a));
}
} //判断变量类型(基本数据类型)
class TypeTest{
static String getType(byte d){ return "byte";};
static String getType(int d){ return "int";};
static String getType(short s){ return "short";};
static String getType(boolean b){ return "boolean";};
static String getType(float s){ return "float";};
static String getType(double d){ return "double";};
}
good question
我们知道,java为了使速度快一些,采取了很多措施,其中一项就是:
在内存中特别开辟一块地方来存放基本数据类型和String类型,这是因为这些类型比较常用,这也导致java不是完全面向对象的这样,整数类型被默认为int的,小数被默认为double的
但是由于在这块内存中,数据最终还是以数据位来表示的,这样,-128~127的整数是以一个字节来存放,其他的整数是以2个以上字节来存放的(这么做的好处是节省内存),这就导致了,直接用-128~127的整数来给byte赋值成了合法的了
这就解释了byte a=1; 的合法性的问题
而1+1这个表达式是直接在这块内存里面进行操作的,所以byte a=1+1;也是合法的但是,对于变量的计算,则是把值复制到另外一块内存里面进行操作的,由于声明的时候a=1的1是在存放基本数据的内存块中指定的,默认情况还是整数,所以提取到外面的时候就被强制转换成4个字节的证书,所以得到的结果并不是一个字节的整数,而是4个字节的整数,这样byte+byte和byte+short和byte+int都为int了,所以不能赋给byte以上为个人猜测,仅供参考,有待专家指正
一个可以装装一升水的杯子 为什么不可以装半升水?
b为 byte型 1个字节
把一个int 给 byte
哪来的的一个杯子装半升水?
3编译时报错,因为b3无法在编译时赋值(因为变量的关系),编译器只能根据byte取值范围小于int这一点来判断,为安全起见而报错,加上强制转换则通过编译;
4在编译时赋值,1+1得2,未超出byte取值范围,可以赋值,编译通过。
引用楼主 haishen0930 的帖子:
1. byte b1=(int)1;
2. byte b2 =1;
3. byte b3 =b1+b2;
4. byte b4 =1+1;
第一行和第四行为什么编译可以通过?
1和2没有区别,变量在编译时赋值,虽然1是int型,但未超出byte的取值范围,编译通过;
3编译时报错,因为b3无法在编译时赋值(因为变量的关系),编译器只能根据byte取值范围小于int这一点来判断,为安全起见而报错,加上强制转换则通过编译;
4在编译时赋值,1+1…
[/Quote
]
OK 虽然会做范围检查,但是这样似乎表示编译器允许一个int型自动赋给一个byte型而不用强转?
2. byte b2 =1;
3. byte b3 =b1+b2;
4. byte b4 =1+1;
第一行和第四行为什么编译可以通过?第二行也可以通过
这是为什么?
因为对byte类型进行赋值时,在byte类取值型范围以内的整数都可以赋值给byte类型,这是规定的,java就是这样规定没办法;
但当在byte类型或short或char类型进行运算时,必须把他们的类型都换成int型进行运算;
所以只有3是错的,其它都正确
说明下,4的是两个常量进行相加,得到是2是int型常量 可以默认赋值给byte类型