`

Java中负数以及类型转换问题

阅读更多
学习过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中String类型和int类型比较及相互转换

    本文将深入探讨Java中String类型和int类型之间的比较方法以及相互转换的技术,这对于理解和优化代码逻辑、提升程序性能具有重要意义。 ### 一、String类型与int类型的基本概念 #### 1.1 String类型 String类型在...

    java基础,进制转换.pdf

    从提供的文件信息中,我们可以提取以下知识点: 1. Java程序的运行环境...通过这些详细知识点,我们可以充分理解Java基础中的数据类型、进制转换、以及与之相关的概念。这对于深入学习Java编程语言是非常有帮助的。

    java 进制转换,二进制 十进制 十六进制 正数 负数的进制等等!.docx

    在编程领域,尤其是在Java语言中,进制转换是一项基本的操作,因为不同的进制系统在不同的场景下有不同的应用。CPU通常使用二进制处理数据,而人类更习惯于十进制,程序员尤其是底层开发者则常使用十六进制。八进制...

    java数字转金额(任意金额、支持负数、前缀0)

    总结来说,Java中将数字转换为金额格式需要处理整数部分的分隔、负数标记以及前导零填充。通过自定义函数或使用内置的格式化工具,我们可以轻松实现这种转换,从而满足在各种应用场景下的需求。

    获取码值(各种类型字符(中、英)的ASCII)和进制转换系统(包括正负数、小数)

    进制转换在Java中可以通过`Integer.toBinaryString()`、`Integer.toString(int, int)`、`Integer.parseInt(String, int)`等方法实现。例如,`Integer.toBinaryString(123)`会返回二进制字符串"1111011"。 综上所述...

    Java中的强制类型转换 大数转小数

    在Java中,大数转小数的强制类型转换中,多出的高位部分会被截断。例如,int类型占4个byte(32位),byte类型占1个byte(8位),那么int类型转换为byte类型时,int的高位24个bit会被截断。 int类型转换为byte类型的...

    解决Java中的强制类型转换和二进制表示问题

    在Java编程语言中,强制类型转换和二进制表示是两个重要的概念,它们与程序的运行效率和数据处理紧密相关。下面将详细讲解这两个主题。 首先,我们来谈谈Java中的强制类型转换。Java是一种静态类型语言,这意味着在...

    JAVA中汉字字符转化为英文字符

    本文将详细介绍如何在Java中实现汉字到英文字符的转换。此技术主要用于提取汉字的首字母或进行其他基于字符编码的操作。通过以下两个核心方法:`toTureAsciiStr` 和 `nuToTrueAsciiStr`,我们将探讨其实现原理及其...

    解决时间戳long转换int溢出(即转换值为负数) long转int

    当long类型的时间戳转换为int类型时,如果long值超过了int能表示的最大值(2^31 - 1,即2,147,483,647),就会发生溢出,转换后的结果会变成负数。例如,在提供的代码片段中,`int intTimeStamp = (int) ...

    详解解密Java中的类型转换问题

    Java 中的类型转换问题详解 Java 是一种强数据类型的语言,数据类型之间的转换有着固定的规则。当窄的数据类型(如 int)转换成宽的数据类型(如 double)时,窄的数据类型会加宽,可以完成自动类型转换,这称为...

    java byte相互转换详解左右位移

    在Java中,基本数据类型byte与int之间的相互转换涉及到计算机的二进制运算、位移操作以及补码的概念。我们首先了解Java中int和byte的数据结构,然后探讨它们之间的转换方法及其背后的原理。 **基本数据类型结构:**...

    Java钱币大小写转换

    Java中进行钱币大小写转换,涉及到数值处理、字符串操作以及中文数词和单位的映射。通过合理的数据结构设计和算法优化,可以高效准确地完成这一任务。对于企业级应用而言,确保金额转换的准确性是至关重要的,这不仅...

    java阿拉伯数字转换成中文传统读法

    在编程领域,尤其是在Java开发中,有时我们需要将阿拉伯数字(1, 2, 3等)转换为中文的传统读法(如“一”,“二”,“三”)。这个任务涉及到字符串处理、数字转换以及对中文字符的理解。在本文中,我们将深入探讨...

    基于java的人民币大写的转换

    在Java编程语言中,将人民币小写金额转换为大写是一项常见的需求,特别是在财务系统或者银行系统的开发中。人民币大写转换主要是为了满足会计规范,确保财务数据的准确性和规范性。下面,我们将深入探讨如何利用Java...

    JAVA实现十进制整数(正负)转换为二进制输出

    任意输入一个十进制整数,包括正数负数,通过程序实现可以输出相应的二进制编码

    java 中文转数字

    中文数字的转换涉及到字符识别、数字映射以及字符串处理等多个方面。以下是对这个主题的详细阐述: 一、中文数字的字符映射 中文数字与阿拉伯数字有着一一对应的映射关系。例如,“零”对应“0”,“一”对应“1”...

    学习文档_JAVA中Integer和Byte转换.doc

    本文档主要探讨了如何在Java中实现这两种数据类型的转换,包括有符号和无符号的转换。 首先,Integer在Java中占用4个字节(32位),其中最高位作为符号位。如果最高位是1,表示这是一个负数;如果是0,则表示正数。...

    java十进制转换二进制

    本篇文章将深入解析一个使用Java语言编写的程序,该程序能够将十进制正数和负数转换为二进制形式。通过分析代码逻辑、算法原理以及实现细节,帮助读者更好地理解十进制到二进制转换的过程。 #### 转换正数到二进制 ...

Global site tag (gtag.js) - Google Analytics