Jump to content
  • Hello visitors, welcome to the Hacker World Forum!

    Red Team 1949  (formerly CHT Attack and Defense Team) In this rapidly changing Internet era, we maintain our original intention and create the best community to jointly exchange network technologies. You can obtain hacker attack and defense skills and knowledge in the forum, or you can join our Telegram communication group to discuss and communicate in real time. All kinds of advertisements are prohibited in the forum. Please register as a registered user to check our usage and privacy policy. Thank you for your cooperation.

    TheHackerWorld Official

Java中的源码,反码和补码

 Share


NedK7

Recommended Posts

 

一、在Java中所有数据都是以补码的形式表示的,原码即数字的二进制表示加符号位,反码即将原码按位取反,补码简单来说即反码加1

二、Java中数据的表示方式

       1.正数:正数的原码、补码、反码都相同,正数的符号位为0;

       2.负数:负数的符号位为1,其余各位使用补码表示

       3.使用补码表示的意义:首先,可以将减法运算转化为加法运算来处理,其次可以用统一的形式表示0,+0和-0的原码是不同的(符号位),而补码唯一。

三、Java中的实数

        对于下面这段程序

2913890-20220912104948646-717934054.png

 

 它的运行结果是这样的

2913890-20220912105108347-1831659123.png

 

 这种误差产生的原因是因为浮点数实际上是用二进制系统表示的。而分数1/10在二进制系统中没有精确的表示,其道理就如同在十进制系统中无法精确表示1/3一样。由于字长有限,浮点数能够精确表示的数是有限的,因而也是离散的。在两个可以精确表示的相邻浮点数之间,必定存在无穷多实数是IEEE 754标准浮点数所无法精确表示的。用32位的单精度浮点数(float)为例,它的符号位占一位(bit),指数部分占8位,尾数部分占23位。现在我们需要存储十进制的0.1这个小数,首先需要把0.1转换成二进制数。然而,我们会发现,十进制的0.1转换成二进制是一个无限循环小数0.0001100110011001100…可是,尾数只有23位,只能截取二进制小数的前23位存储。这时,误差就产生了。当再次把这个浮点数转换成十进制数时,由于损失了一些二进制位,转换回来的十进制数自然也就与原来的不同了。

浮点数的储存方式:通常浮点数将实数分为阶码和尾数来表示,例如10.0111表示为0.100111*2^10.0.10011是尾数,10是阶码。在储存时,如果系统用更多的位来储存尾数,可以增加数值的有效数字位,提高精度,但是表数范围会缩小,如果用更多的位来存储阶码,可以扩大表数范围,但精度会降低。因此,浮点数并非真正意义上的实数,只是在某种范围内的近似。

Link to post
Link to comment
Share on other sites

 Share

discussion group

discussion group

    You don't have permission to chat.
    • Recently Browsing   0 members

      • No registered users viewing this page.
    ×
    ×
    • Create New...