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

toHexString()函数

    toHexString()函数的参数是整型吗,如果实参是一个字节或者四个字节,是否会发生类型转换?

正在回答

3 回答

public static String toHexString(int i)

这个是本方法的声明,一个一个解答问题,它的参数是整型的。

在java中int类型就是四个字节的,所以如果实参是四个字节是不会发生类型转换的啊,其实有点没明白为什么问这个问题,是不是因为视频中出现的 .toHexString(char b&0xff)这个句子,会觉得里面是16位的数据?

其实做这个主要是为了防止char转成int 类型由于计算机补码存储方式的原因,要专门设置最高位符号位。

由于char类型是16位二进制的(两字节),而且最高位有可能是1,但在补码中首位为1表示负数,首位为0表示正数,所以,如果没有按位与,存在最高位是1的char型,则计算机会在转成32位时,先把它当成补码,觉得他是负数,然后前面就补16位1,

现在做按位与运算,由于char类型只有16位,要和32位按位与,前面先补0,这样做之后,前16位就是0了,这样的存储方式符合计算机的数据类型存储规律。

所以如果实参是一个字节或两个字节,那么如果不做0xff这样的按位与运算,它会自动类型转换(小类型转大类型),但很有可能会发生运算错误,如果是四个字节其实道理类似,就看你这个数据是否会在存取上面由于补码的运算问题导致乱码或者其他错误。

(这样解释对你有帮助吗?

-----------用心回答求表扬~)

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

qq_酸牛奶_0 提问者

谢谢这么多的回答,本来以为会回答的很慢。受宠若惊。 但是不明白为什么要位与上0xff。老师说的是"把前面24位去掉"对吧;第一个问题,为什么是24位呢,char类型不是占16位吗;第二个问题,16位的char位与0xff的结果是8位还是16位;第三个问题,“& 0xff”后不是还会发生类型转换吗;第四个问题,为什么自动类型转换“很可能发生运算错误”? 还请大神指教,谢谢啦。
2016-07-10 回复 有任何疑惑可以回复我~
#2

要做Java大师 回复 qq_酸牛奶_0 提问者

我查了一下,当时我说错了,char类型是两个字节8位,所以老师说把前面24位去掉。 按位与如果位数不够前面需要补零,所以与8位的结果就一定是8位了(当时发现说错了,不过找不到你的提问了,我也担心好久,误导你了,不好意思啊) 这个时候会发生类型转换的,因为要从8位变成32位,所以前面会自动补零。 一般自动类型转换发生运算错误出现在从高位转低位的情况,高位低位是相对位数说的,比如8位就算低位,32位就算高位,从32位转到8位,如果这个数字其实是在8位可以表示范围内的,就不会出错了,如果是8位表示不了的,比他能表示的最大数还大,就会发生溢出,这就是他说的运算错误。
2016-07-12 回复 有任何疑惑可以回复我~
#3

qq_酸牛奶_0 提问者 回复 要做Java大师

感谢回答,但是还想再钻会儿牛角尖。 按您说的,发生错误的情况就是大的转化为小的,长字节转化为短字节吗?“按位与如果位数不够前面补0”那么“& 0xff”使用的前提就是已知原数位数不超过8个位对吧,否则前面的都变成0了就不对了。既然它只能用在已知原数不超过八位的情况,也就是说直接类型转换也不会出错,那么“& 0xff”似乎实际上没有什么用啊。 另外,java里面的char是16位的。
2016-07-12 回复 有任何疑惑可以回复我~
#4

要做Java大师 回复 qq_酸牛奶_0 提问者

刚刚看了一篇文章,是说 .toHexString(byte b&0xff)是为了将高24位清零,这个说的是和我们想得不一样,b会先强制类型转换,成32位,这时如果是负数(当然作为byte类型它其实并不代表一个负数)做补位肯定会在前24位上加符号位1,然后才会做&0xff,这下这个与运算就很有意义了,可以消除掉高24位的1,(因为byte的首位并不代表符号嘛,所以对前24位做符号位的补位就不合理了)。 另外谢谢你的纠正~
2016-07-12 回复 有任何疑惑可以回复我~
#5

qq_酸牛奶_0 提问者 回复 要做Java大师

谢谢,差不多明白了。 但是byte转int为什么前面补的是1而不是0呢,最高位补1不就变成负数了吗。
2016-07-13 回复 有任何疑惑可以回复我~
#6

要做Java大师 回复 qq_酸牛奶_0 提问者

符号位嘛,如果是01111111,那他觉得这是一个正数,补成16位就是前面补八个0,如果是11111111,那么他觉得这是一个负数(-1),那么他就在前面补八个1,16个1在补码中还是-1,它以为这样做可以保持值不变。事实上,在byte类型中11111111是255的意思,不是-1
2016-07-13 回复 有任何疑惑可以回复我~
#7

qq_酸牛奶_0 提问者 回复 要做Java大师

明白了,谢谢
2016-07-13 回复 有任何疑惑可以回复我~
#8

charsandrew 回复 要做Java大师

你们说的意思我大概明白,我有个疑问是(b & 0xff)之后是32位还是8位,如果是32位,以16进制打印出来的时候为什么不是000000c4,而结果是c4 。
2016-07-18 回复 有任何疑惑可以回复我~
查看5条回复

@要做Java大师:

似乎有的byte会补1有的不会:
“慕课网ABC”的三种输出:
System.out.print(Integer.toHexString(b)+" ");
System.out.print(Integer.toHexString(b & 0xff)+" ");
System.out.print(Integer.toBinaryString(b)+"\n");
ffffffc4 c4 11111111111111111111111111000100
ffffffbd bd 11111111111111111111111110111101
ffffffbf bf 11111111111111111111111110111111
ffffffce ce 11111111111111111111111111001110
ffffffcd cd 11111111111111111111111111001101
fffffff8 f8 11111111111111111111111111111000
41 41 1000001
42 42 1000010
43 43 1000011

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

charsandrew

b & 0xff 中有一点我觉得很奇怪,这里的b是一个字节也就是8位,不进行& 0xff 的话,会自动转换成32位,以16进制表示就是ffffffc4 ,那么 (b & 0xff)之后到底是几位,如果是32位的话,打印出来为什么不是000000c4 ,如果这样运算之后是8位,那么toHexString为什么没有给它转换成32位呢?
2016-07-18 回复 有任何疑惑可以回复我~

byte转int低位转高位啊,自动转型,低位转高位

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

qq_酸牛奶_0 提问者

低位转高位什么意思?
2016-07-10 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

toHexString()函数

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