Java中byte的符号位
来源:互联网 发布:gcc for windows下载 编辑:程序博客网 时间:2024/06/07 05:28
转自:http://blog.csdn.net/yarshray/article/details/4203282
在Java中byte类型是有符号的,而Java中又没有提供无符号的byte类型,因此在其表示范围为-128-127之间。而这样对于一些I/O处理程序来说需要对考虑符号位问题,通常的做法可能是:
int unsignedByte = signedByte >=0 ? signedByte : signedByte + 256;
这里我们发现,由于byte的符号位的关系,我们不得不采用长度更长的int类型来处理符号位带来的问题。因此,我们会觉得byte由于要考虑符号位其范围变小了,所以,我们只好通过int来处理。在这个类型的转换过程中,任意长度的int类型会截断其高位的字节来适应byte类型,因为int类型要比byte类型宽。这也就是为什么一个int的127转换成了byte还是一个127。
不过,我们考虑另外一种情况,就是当一个int值大过byte表示的数值范围的时候,这个时候问题就出现了。比如,int的128转换成一个byte类型会是-128。这是因为补码运算的关系造成的。首先,128写成16进制是0x00000080,当做int到byte的类型转换的时候,前面的0被截断形成0x80。在二进制中0x80可以写成10000000,如果这是一个无符号数哪么一切正常,但是如果是一个有符号数就会经过补码运算。对于负数而言,其补码运算就是反码(就是1转换成0并且反正既然)加一。哪么,10000000的补码就是01111111加一,即10000000=128(十进制)。因此,byte0x80事实上表示的也
就是-128了。类似的int类型的129就是byte类型的-127,而int类型的130则是byte类型的-126,等等,直到int的255对应为byte的-1。
哪么如果到了256呢?此时,地位的字节被0来填充,简而言之256就是0x00000100。因此,转换成byte就是0,这个转换循环也就是256个。因此,我们根据上述原理,得出如下规律:
byte byteValue=0;
int temp = intValue % 256;
if ( intValue < 0) {
byteValue = (byte)(temp < -128 ? 256 + temp : temp);
}
else {
byteValue = (byte)(temp > 127 ? temp - 256 : temp);
}
上述过程中,我们既可以把有符号的byte转换成无符号的byte(用int类型存储),也可以把有符号但可能超出byte范围的数据转换成有符号的byte。
- Java中byte的符号位
- Java中byte的符号位
- Java中byte的符号位
- Java中byte的符号位
- Java中byte的符号位
- Java中byte的符号位
- Java中byte的符号位
- java中int值转化为byte的符号问题
- Java| Java中字节Byte和位Bit的关系
- 获取java byte的无符号数值
- java byte的无符号数值
- 获取java byte的无符号数值
- JAVA byte有无符号数的转换
- java 中 int 与 byte 位运算
- java中byte,short的无符号右移(>>>)的问题
- 对于Thinking In Java中byte,short无符号右移的理解
- java中byte(byte []), int的转换
- Java中的Byte转为无符号的Integer
- CSS:文本行(总结笔记)
- 静态代码块-static关键字
- 机器学习(3)经典算法介绍
- Dreamweaver02——安装体验02——Dreamweaver CC 2015
- Git入门级教程,代码的保存与恢复
- Java中byte的符号位
- UVA 11300 Spreading the Wealth 分金币
- iOS使用web clip生成桌面快捷方式
- 启用MVC注解(尴尬)
- LeetCode:Kth Smallest Element in a Sorted Matrix
- JAVA_UDP发送端和接受端
- netstat查看端口
- centos 3.0 搭建
- 树状数组 知识点