关于java中byte a=1;的问题

上述的语句是合法的,我们可以把一个整数常量1赋给byte类型的变量a,这是上述语句是合法的,但是java不允许float a=1.0;这样的形式,因为浮点数默认以double存储,所以不能直接赋值给float。但是这跟上例特点完全一样,但却一个合法,一个不合法。这是为什么呢?

可以这么说byte是int的子集,byte表示范围是-128-127;在这个范围内可以用整形常量(注意一定是整形常量不是整形变量)复制给byte类型的,这样做的目的就是为了节约更多的资源。追问

那么就是说float不是double的子集??这好像不对吧?

追答

float和double涉及到精度问题,5.0和5.00精确度你能说5.0是5.00的子集吗

追问

我终于弄明白了,多谢!!!

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-01-20
因为1是常量,并且没有超过byte的范围,所以编译通过,假如换成变量就不行,因为变量值是不确定的,所以可能会超过byte的范围,所以编译通过不。
你改成 int a = 1; tyte b = a; 这样编译就通不过了追问

那么同样的float a = 1.0呢,1.0也是常量,而且也没超过范围,但是却不合法。我知道浮点数默认以double存储,但是整数也同样默认以int存储啊,它为什么就可以付给byte呢?

追答

1.0默认是double类型小数点后面有15为0,float小数点后面是6为0,将1.0赋给float要切掉后面的0,会损失精度,所以不能通过编译 虽然后面是0 系统也把它当做小数位, 而常量转到tyte型,已确定不会有损失精度的问题

第2个回答  2014-01-20
在计算机存储中,int类型可以转换成byte,是因为计算机对int类型处理只需要进行截断处理,但是double类型就有点烦了,你可以去查一下浮点数规格化处理,这方面我也不是很了解。
这方面的知识就涉及到了计算机组成原理了,如果有兴趣可以深入的探究,以后在开发中没时间纠结这些问题了追问

您好,感谢您的回答,对我很有帮助。但是只能采纳一个答案,所以………祝您新年快乐~>_<~

第3个回答  2014-01-20
float a=1.0f;
这样就合法了追问

我知道但是您并没有回答我的问题。

我知道但是您并没有回答我的问题。

我知道但是您并没有回答我的问题。

追答

就这么规定的啊。
float是单精度吧 而默认情况是double 为了作区分 在分配空间是double的要大的多

追问

类型转换我知道,但是我的问题是:1是默认作为int进行存储的,但是java确允许将它赋值给byte,按逻辑说这样分明不对嘛

关于java中byte a=1;的问题
可以这么说byte是int的子集,byte表示范围是-128-127;在这个范围内可以用整形常量(注意一定是整形常量不是整形变量)复制给byte类型的,这样做的目的就是为了节约更多的资源。

java问题byte a=1,b=1;byte c=a+b;为什么错
你所问的这个问题叫“自动类型提升”在java中,对char, byte和short类型的字符串进行数学算法操作,比如+,-,>>位移操作,都会引发 自动类型提升,结果将是int类型,a+b的结果是int, 要将int的值赋给byte就必须进行类型强制转换。以下这句,是从think in java 3rd中摘出来的,希望对你有帮助。In ...

JAVA为什么byte b=a+1会报错
byte a = 1;byte b = a+1;∥+会自动提升类型,a被提升为int,a+1是个表达式,是不确定的,所以=不会自动转换类型,需要,改为byte b = (byte)(a+1)———byte a = 1;a +=2;∥+把a被提升为int类型,2取自常量池int,1+2得3,常量+常量得常量,常量在+=(=)后面,...

Java创建byte型变量需要在数值的后面加b吗?为什么?
为了跟int做区分。byte在java中是字节表示的。。b表示bit。

java中不存在byte\/short型常量的表示法。但可以把一定范围内的int型...
1、所谓常量,就是在程序运行时,不会被修改的量,在java中定义常量的表达式是声明的时候加上 static final修饰符,表明该变量不可被修改,称之为常量 2、java中可以声明byte\/short的常量,比如:public static final byte a = 1;但是,byte的值必须在byte类型的范围内,即:-128~+127 3、java中...

java中byte变量的范围问题
byte是一个字节,其中有8位,取值范围为 -128~+127,闭区间 因为有符号,所以符号位占一位 -128的二进制位 1000 0000 也就是0X80 这个不叫溢出。。是不是你看错了 +127就是 0111 1111 也就是0X7F。。

Java中整数类型转换
\/\/byte运算byte a=1;byte b=2;byte x=(byte) (a+b);System.out.println(x);\/\/short运算short w=1;short s=2;short z=(short) (w+s);System.out.println(z);注意:在这个的强制类型转换中,因为涉及到了运算中类型提升问题,所以应当将a+b或w+s 整体用括号扩住,否则编译器...

java 数据类型转换的问题 byte a = 100; int b = 98; byte c = (byte...
byte类型使用1字节存储,表示范围-128~127,int使用4字节存储,当byte+int时会将结果类型转为int,因为int表示范围大于byte,不影响精度,所以结果为197,但是当(byte)(a+b)时,是将计算结果int转为byte,存储空间也有4字节变为1字节,即是保留8个bit,把他们全部转换成2进制=11000110(198刚好8位),此时...

JAVA里两个byte型数据怎么合成一个16位有符号的short型数据啊?两个byte...
\/\/ 拆分byte high = (byte) (0x000000FF & (x>>8));byte low = (byte) (0x000000FF & x);\/\/System.out.println(high);\/\/System.out.println(low);\/\/ 复原short z = (short)(((high & 0x000000FF) << 8) | (0x000000FF & low));正数,负数都OK~~...

求java编程 字节byte怎么转换成整形int?
Java中的一个byte,其范围是-128~127的,而Integer.toHexString的参数本来是int,如果不进行&0xff,那么当一个byte会转换成int时,对于负数,会做位扩展,举例来说,一个byte的-1(即0xff),会被转换成int的-1(即0xffffffff),那么转化出的结果就不是我们想要的了。而0xff默认是整形,所以,一...

相似回答
大家正在搜