黑马程序员技术交流社区

标题: 常量byte 定义byte b=(byte) 999959699;为什么正常输入 [打印本页]

作者: ⑷嚸V恱    时间: 2013-8-14 14:35
标题: 常量byte 定义byte b=(byte) 999959699;为什么正常输入
byte 的范围:-128~127

常量byte 定义byte b=(byte) 999959699;为什么正确,在加一位byte b=(byte) 9999596992;就编译不过了。
  1. public class Test3 {
  2.         public static void main(String[] args) {
  3.                 String s="好";
  4.                 byte[] bt=s.getBytes();
  5.                
  6.                 char a='好';
  7.                 byte a2='a';
  8.                 byte b=(byte) 999959699;
  9.                 byte b2=0101;
  10.                 System.out.println("bt="+bt);
  11.                 System.out.println("a="+a);
  12.                 System.out.println("a2="+a2);
  13.                 System.out.println("b="+b);
  14.                 System.out.println("b2="+b2);
  15.         }

  16. }
复制代码
byte b2=0101; 正常输入 byte 直接可以识别二进制?
String s="好"; 汉字已二进制存储 我怎么知道是二进制的值。Integer.toBinaryString()可以看到数字的二进制,汉字怎么搞。
童鞋们帮助一下

作者: longlangcx    时间: 2013-8-14 15:59
强制类型转换是截断式操作,直接截取低8位转为byte,前面的位舍弃。byte b=(byte) 999959699;就属于这种情况。

而byte b=(byte) 9999596992;编译通不过是因为编译器把9999596992解析为一个int,但是其值是超范围的,因此报错。我记得好像是int最多21亿多~?这个都99亿了。
改成byte b=(byte) 9999596992L;应该就能通过编译了

byte b2=0101; 正常输入 byte 直接可以识别二进制?-------- 你这0101不是二进制,是八进制。。

String s="好"; 汉字已二进制存储 我怎么知道是二进制的值。 -----还可以用Integer.toBinaryString,截取下子串就好了
for(byte b : s.getBytes()){
    System.out.print(Integer.toBinaryString(b).substring(24));
}
作者: ⑷嚸V恱    时间: 2013-8-14 21:11
longlangcx 发表于 2013-8-14 15:59
强制类型转换是截断式操作,直接截取低8位转为byte,前面的位舍弃。byte b=(byte) 999959699;就属于这种情 ...

1.直接截取低8位转为byte 怎么截取的 打印的结果 b=-109 那这个值 是怎么来的
2.byte b2=0101 因为是0开头的说明是8进制的。 那二进制的怎么表示呢
3.System.out.print(Integer.toBinaryString(b).substring(24));
字符串为什么从24 位开始截取,111001011010010110111101bt=[B@de6ced,
bt=[B@de6ced 代表什么意思
作者: 封号了...    时间: 2013-8-14 21:17
longlangcx 发表于 2013-8-14 15:59
强制类型转换是截断式操作,直接截取低8位转为byte,前面的位舍弃。byte b=(byte) 999959699;就属于这种情 ...

String s="好"; 汉字已二进制存储 我怎么知道是二进制的值。 -----还可以用Integer.toBinaryString,截取下子串就好了??
为什么要截取下子串呢??
直接
for(byte b : s.getBytes()){
     System.out.print(Integer.toBinaryString(b));
}
这样不就对了么??
大哥求解!!
作者: longlangcx    时间: 2013-8-14 21:24
⑷嚸V恱 发表于 2013-8-14 21:11
1.直接截取低8位转为byte 怎么截取的 打印的结果 b=-109 那这个值 是怎么来的
2.byte b2=0101 因为是0开 ...

1. 就是说你那个 999959699 的二进制形式是:
xxxx xxxx xxxx xxxx xxxx xxxx yyyy yyyy
(具体里面是啥数你直接用toBinaryString看下好了)
把其中的yyyy yyyy转成十进制整数形式,就是-109

2.二进制是内部存储形式,常量没法直接用二进制表示。

3.因为int是4字节32位的,byte是1字节8位的,所以直接截取后8位就好了
bt=[B@de6ced,这是你在我的代码后面又print了一个"bt=" + 一个byte数组吧。。我那句没写换行符。。
[B代表数组,@后面是hashcode
作者: longlangcx    时间: 2013-8-14 21:33
封号了... 发表于 2013-8-14 21:17
String s="好"; 汉字已二进制存储 我怎么知道是二进制的值。 -----还可以用Integer.toBinaryString,截取 ...

也可以吧。。不过一个char是2字节的,getBytes之后就变成了2个byte,因为Integer.toBinaryString接收的是一个int,所以这俩byte传禁区会向上提升为int,如果是正的倒是还好说,如果是负的,前面填充1,输出字符串会变成64位的长度~~而本来只是16位的长度。。
作者: 想进黑马培训    时间: 2013-8-14 22:16
强制转换了,直接截断了!
作者: 封号了...    时间: 2013-8-15 00:30
longlangcx 发表于 2013-8-14 21:33
也可以吧。。不过一个char是2字节的,getBytes之后就变成了2个byte,因为Integer.toBinaryString接收的是 ...

刚没用中文测试,的确是一个中文getBytes之后会变成2个byte,但是并不是char的原因,是因为我们用的GBK编码,如果用UTF-8的话,应该会是3个byte,如果仅仅是一个字符的话,那么会是1个byte,Integer.toBinaryString的确接受的是一个int,这两个byte是会向上提升为int,
但是我试过了很多中文,前面都是1,即使换成UTF-8,前面还是1,这里我就纳闷了,
问什么中文的补码都是负的呢?还是getBytes之后出的问题??
大哥能不能教教!!??
作者: longlangcx    时间: 2013-8-15 09:56
封号了... 发表于 2013-8-15 00:30
刚没用中文测试,的确是一个中文getBytes之后会变成2个byte,但是并不是char的原因,是因为我们用的GBK编 ...

编码细节我也没啥研究。。估计是本身的编码方式的问题吧,因为支持单字节、双字节、多字节的字符,所以肯定要用一种方法来区分出某字节是单独的一个字符,还是一个多字节字符的一部分。这样用字节开头的字符来区分可能比较好吧,就好像ip地址用开头几位来区分是几类地址一样。。而中文字符可能正好所在的双字节区域首位都是1开头的吧,这样就都变成负的了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2