为了账号安全,请及时绑定邮箱和手机立即绑定

关于String转化为byte数组后,不进行&0xff,打印出的结果,上图,为什么是这样,汉字的一个字节前面为什么有那么多的1

11111111111111111111111111000100  

11111111111111111111111110111101    前两行为“幕”

11111111111111111111111110111111 

11111111111111111111111111001110   前两行为“课”

1000001  “A"

1000010   "B"

1000011  "c"


正在回答

4 回答

你这样可不好哦。这种情况我们可以查看 Integer.toHexString(int i); 的API文档:

“The unsigned integer value is the argument plus 2^32 if the argument is negative; otherwise, it is equal to the argument.”

文档说如果参数为负,那么无符号的整数值为参数加上 2^32作为参数;否则等于该参数。

那就简单了,因为这个的“慕”“课”2个字的GBK编码为 11000100(C4BD)、10111101(BFCE)(http://www.mytju.com/classCode/tools/encode_gb2312.asp查询),其作为 int 类型参数时为负数,所以实际参数为00111100+2^32、01000011+2^32 刚好就是 11111111111111111111111111000100  和  11111111111111111111111110111101。而几乎所有的编码格式中的字母都是传承的ASCII中的编码,即a~z:61~7A、A~Z:41~5A,不存在转 int类型为负的问题。

这些也是我看到你的问题后才去查阅资料了解的,我还是希望大家学习编程过程中多一些磨砻淬砺,少一点不求甚解。对原理的掌握多少,觉顶你以后的高度。

1 回复 有任何疑惑可以回复我~
#1

武当王也 提问者

非常感谢!
2015-08-27 回复 有任何疑惑可以回复我~
#2

詹士

你好,2^32是指把2和32分别变成2进制之后进行异或运算么?然后再把结果加上那两个字的二进制编码形式的值么? 再然后,你说“而几乎所有的编码格式中的字母都是传承的ASCII中的编码,即a~z:61~7A、A~Z:41~5A,不存在转 int类型为负的问题。”,为什么传承ASCII中的编码就不存在转INT为负的问题? 如果你没时间解释,我需要看什么书补充哪方面的知识来了解?
2015-09-23 回复 有任何疑惑可以回复我~
#3

资深老饕 回复 詹士

C4BD、BFCE的2进制表示为1100010010111101、 1011111111001110。2^32=2的32次方. 居然限制字数--,算了,你搜索一下补码个GBK编码。不懂再联系我邮箱lancaoren@gmail.com,我已经不在imooc学习了。书的话,不管你干什么,只要你还编程,而且还不是计算机相关专业的学生的话,这些书早晚得看:操作系统,数据结构、算法分析、微机原理。可以随便看看了解以下,具体的会和以后的学习工作相互促进。
2015-09-30 回复 有任何疑惑可以回复我~
#4

詹士 回复 资深老饕

谢谢!
2015-10-01 回复 有任何疑惑可以回复我~
查看1条回复

学习了

0 回复 有任何疑惑可以回复我~

我知道了,byte为8位,int为32位,将byte转化为int,也就是相当于将byte再增加24位,这24位默认为零,汉字对应的因为反码或者什么原因,前面添加的是1,

1 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

关于String转化为byte数组后,不进行&0xff,打印出的结果,上图,为什么是这样,汉字的一个字节前面为什么有那么多的1

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信