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

循环中不加0xff 第一个循环出的结果是ffffffc4 ffffffbd ffffffbf ffffffce 41 42 43 ,不是老师讲的前24位都是零,为什么?

循环中不加0xff 第一个循环出的结果是ffffffc4 ffffffbd ffffffbf ffffffce 41 42 43 ,不是老师讲的前24位都是零,为什么?

正在回答

4 回答

首先老师讲的有点小错误,不是去掉24个0,是去掉24个【0或1】.为什么呢? 我们以GBK编码的‘慕’为例,如果直接输出Integer.toHexString( b ),不进行&操作。结果是:ffffffc4  ffffffbd.可以看出&操作去掉的是6个f也就是24个1.不应该是24个0吗?我们知道一个字节占8位,可以表示两个16进制数,c4和bd的2进制表示分别为:1100 0100,1011 1101.可以看到他们的第一位都是1.而计算机是以补码形式存储数据。当计算机读取c4时,发现第一位是1,所以c4表示的整数是负数,要得到该负数需要进行取反+1操作得到它表示的正数,然后添加符号位。1100 0100取反+1后是0011 1100,即十进制的60,所以c4表示的是-60。而-60作为一个整形在内存中是以ffffffc4存储的。为了验证这种想法,我们直接输出b,也就是b的整数形式System.out.print( b + "  " );结果是:-60  -67.什么时候&的作用是去掉0呢,没错,这个字节的二进制存储中第一位是0,也就是说是个正数。比如'腣'这个字,它的Integer.toHexString( b )结果是ffffffc4  56,第二个字节56在内存中的二进制数是0101 0110,所以当读取56这个十六进制数时,自然当做正数存储,而正数的补码是其本身!

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

charsandrew

我这里有些疑问:(b & 0xff)运算后得到的数是32位还是8位? 如果是32位,以16进制打印输出时为什么不是000000c4, 如果是8位,在api中说toHexString()接受的参数是int类型,那程序是否会对这个8位的字节进行类型转换呢?
2016-07-18 回复 有任何疑惑可以回复我~
#2

每天一学 提问者

非常感谢!
2016-10-19 回复 有任何疑惑可以回复我~

加入0xff是吧当前数组&0000-0000 0000-0000 0000-0000 1111-1111.这样取到的是最低八位,既是有效数字

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

ff代表8个1,跟32位的字符相与之后不论前24位是0还是1,都会只剩后8位

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

这是16进制显示方式  你试下

System.out.print(Integer.toBinaryString(变量));

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

举报

0/150
提交
取消

循环中不加0xff 第一个循环出的结果是ffffffc4 ffffffbd ffffffbf ffffffce 41 42 43 ,不是老师讲的前24位都是零,为什么?

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