学习过java的都知道,在java中,不是直观的表示负数,而是采用补码的形式表示负数。这是为了硬件操作的方便,把减法也转换成加法来运算。
那补码是怎样表示的呢?为了得到补码,我们引入了反码。对于正数来讲,它的反码补码都为本身,如果不明白为什么,我们可以这样理解:引入反码补码的原因就是为了解决减法的问题,换句话数就是解决java中负数的问题,正数不存在这些问题,所以它的反码补码就是它本身。在有符号的基本数据类型中,最高位0表示正数,最高位1表示负数。 对于负数来讲,它的反码就是除去符号位取反,然后加1就得到了它的补码。
这里举个简单的例子,一个byte型数据,它在计算机中占8位,-7可以表示为10000111,最高位的1代表负号,它的反码是除去符号位各位取反为11111000,然后加1得到补码11111001。8的二进制表示为00001000,现在我们运算8 - 7,在计算机并不是用8减去7,而是用8 + (-7),也就是用00001000加上-7的补码11111001,两个有符号数相加,如果符号位相加有近位就删去符号位的进位,得到00000001,也就是1.
java中我们经常也会遇到不同数据类型的转换,这是最容易出错的地方。首先我们了解一下什么是符号扩展,对于正数来讲,在前面补0; 负数时在前面补1。比如8位的二进制数10000111扩展为16位,我们在前面加上8个1,1111111110000111;如果是正数,则在前面补0。这样进行扩展后,符号和数值的大小都不变。
接下来我们我们看一下不同类型之间是怎样转换的,首先我们要知道这些基本类型各自占几位。
有符号型:
byte = 8
int = 32
short = 16
long = 64
float = 32
double = 64
*boolean 只占一位,用0和1代表false和true。
无符号型:
char = 16
1. byte型转为char型
因为byte是有符号类型,再转成char型时需要进行符号位扩展,如果是正数就在前面不上8个0, 如果是负数就在前面补上8个1。例如11111111(0xff)左边连续补上8个1结果是0xffff。因为char是无符号类型,所以0xffff表示的十进制数是65535。
2. char型转为int型
因为char是无符号类型,转换成int型时进行在前面补上16个0,用十进制表示结果为结果0x0000ffff,对应的十进制数是65535。
3. int型转为byte型
因为int是32位,而byte类型值只占8位,直接截取最后8位。例如-1的补码为0xffffffff,转换为byte型后为0xff,值为-1。
总结:如果最初的数值类型是有符号的,那么就执行符号扩展;如果是char类型,那么不管它要被转换成什么类型,都执行零扩展。还有另外一条规则也需要记住,如果目标类型的长度小于源类型的长度,则直接截取目标类型的长度。例如将int型转换成byte型,直接截取int型的右边8位。
参考引用:
Joshua Bloch, 陈昊鹏译 - 《Java解惑》
分享到:
相关推荐
将正数转换成负数,负数转换成正数, int main(int argc, char* argv[]) { float k; c.f=-10; k=0-c.f; printf("k=%f\n",k); printf("Hello World!\n"); return 0; }
java 进制转换,二进制 十进制 十六进制 正数 负数的进制等等!.docxjava 进制转换,二进制 十进制 十六进制 正数 负数的进制等等!.docx
任意输入一个十进制整数,包括正数负数,通过程序实现可以输出相应的二进制编码
获取字符的码值,包括中文。 进制转换包括:十进制(整数/小数/负数)转成二进制、八进制、十六进制。 供需要学习Java基础的朋友参考学习。
逆波兰算法的java版,能够将运算字符串转换为逆波兰式,并尽心简单的错误判断处理!
java字符串类型数字设置千分位分隔,可对整数、带小数点的数字、负数进行千分位分隔。并对字符串进行了数字判断,非数字类型的字符串不进行转换。
数字到人民币大写转换程序(java)支持负数,解决零零,。
java语言编写的十进制正数和负数转换二进制算法。
NULL 博文链接:https://yunjiechao-163-com.iteye.com/blog/2405042
今天小编就为大家分享一篇解决Java中由于数据太大自动转换成科学计数法的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
当验证器检测到某个类文件中存在内部不兼容或者安全问题时抛出该错误。 40.java.lang.VirtualMachineError 虚拟机错误。用于指示虚拟机被破坏或者继续执行操作所需的资源不足的情况。 41.java.lang.Arithmetic...
主要介绍了Java编程BigDecimal用法实例分享,具有一定参考价值,需要的朋友可以了解下。
如果考虑到零的交叉(zero crossing )问题,你就容易理解Java (以及其他绝大多数语言)这样用2的补码的原因。假定byte 类型的值零用00000000 代表。它的补码是仅仅将它的每一位取反,即生成11111111 ,它代表负零...
机房环境监控系统VX交流加 -- jfjkrj ...1.java TCP通信实现对接硬件发送与接收十六进制数据 & int与byte的转换原理 & java中正负数的表示demo 2.java如何发送16进制字符串给机器,并得到机器返回的16进制字符串
Java 实现10进制的整数往2进制 3进制 4进制 16进制的转换 应该还可以优化
引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始...
Java中常量的分类: 1,整数常量。所有整数 2,小数常量。所有小数 3,布尔(boolean)型常量。较为特有,只有两个数值。true false。 4,字符常量。将一个数字字母或者符号用单引号( ' ' )标识。 5,字符串常量。...
其他还有很多异常,我就不一一列举了,我要说明的是,一个合格的程序员,需要对程序中常见的问题有相当的了解和相应的解决办法,否则仅仅停留在写程序而不会改程序的话,会极大影响到自己的开发的。关于异常的全部...
modbus从站读写有正负号(有符号)的数据,在vs下进行了测试,用的是c++语言,测试工具为Modbus slaves
使用javac编译BMPImage.java BMPTool.java Run.java 使用“ java Run”或“ java [args] --help”运行,以获取帮助消息 遵循菜单说明 测试影像 正面测试 windows.bmp,tiger.bmp 阴性测试-异常退出 情况“不是每个...