Java将int转换为byte时的奇怪行为?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java将int转换为byte时的奇怪行为?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1208字,纯文字阅读大概需要2分钟。
内容图文
![Java将int转换为byte时的奇怪行为?](/upload/InfoBanner/zyjiaocheng/716/63a940977a254d35bc50952b1139c252.jpg)
int i =132;
byte b =(byte)i; System.out.println(b);
Mindboggling.为什么输出-124?
解决方法:
在Java中,int是32位.一个字节是8位.
Java中的大多数原始类型都是有符号的,而byte,short,int和long则以二进制补码编码. (char类型是无符号的,符号的概念不适用于boolean.)
在此数字方案中,最高有效位指定数字的符号.如果需要更多位,则将最高有效位(“MSB”)简单地复制到新MSB.
所以如果你有字节255:11111111
并且您希望将其表示为int(32位),您只需将1复制到左侧24次.
现在,读取负二进制补码的一种方法是从最低有效位开始,向左移动直到找到第一个1,然后反转每一位.结果数字是该数字的正数
例如:11111111转到00000001 = -1.这就是Java将显示为值的内容.
您可能想要做的是知道字节的无符号值.
您可以使用位掩码来完成此操作,该位掩码删除除最低8位之外的所有内容. (0xff的)
所以:
byte signedByte = -1;
int unsignedByte = signedByte & (0xff);
System.out.println("Signed: " + signedByte + " Unsigned: " + unsignedByte);
打印出来:“签名:-1无符号:255”
这里到底发生了什么?
我们使用按位AND来屏蔽所有无关的符号位(最低有效8位左边的1).
当int转换为字节时,Java会从最左边的24位中删除
1111111111111111111111111010101
&
0000000000000000000000001111111
=
0000000000000000000000001010101
由于第32位现在是符号位而不是第8位(我们将符号位设置为0,这是正数),因此字节的原始8位由Java读取为正值.
内容总结
以上是互联网集市为您收集整理的Java将int转换为byte时的奇怪行为?全部内容,希望文章能够帮你解决Java将int转换为byte时的奇怪行为?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。