负整数及浮点数的二进制表示


前言

对于该代码

public class hello {
    public static void main(String[] args) {
        int a = -17;
        System.out.println("二进制输出"+Integer.toBinaryString(a));
        int b = 17;
        System.out.println("二进制输出"+Integer.toBinaryString(b));
    }
}

输出的结果
在这里插入图片描述
故对负整数及浮点数的二进制表示好奇。

因在学习《深入理解计算机系统》这门课时,在第二章《信息的表达和处理》中又接触了相关知识,对浮点数在计算机中的表示,以及有符号和无符号整数的加法减法等知识有了新的认识。故在此进行补充。

一、负整数的二进制表示

1.原码

原码即该数的绝对值的二进制表示。在该代码中,-17的原码即为17的二进制10001,int类型的数据占用四个字节即32位,但省略前面的0。

2.反码

反码即把原码按位取反,如1变为0,0变为1。在该代码中,10001的反码为11111111111111111111111111101110。

3.补码

补码即将反码加一。在该代码中,11111111111111111111111111101110加1为11111111111111111111111111101111。即为负整数的二进制表达。

二、浮点数的二进制表示

1.公式:

在这里插入图片描述

根据国际标准IEEE 754,任意一个二进制浮点数V可以表示成下面的形式:
(1) (-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。
(2)尾数M表示有效数字,是一个二进制小数,它的范围是1~2-ε或者0 ~ 1-ε。
(3)2^E表示指数位,E为阶码。
在这里插入图片描述

例如:
将float=1.25f转化为二进制。
s=0;M=1.25;E=2;
对于float类型。首位为符号位,接下来的8位为阶码部分,余下的23位为尾数部分。
1.首先将该数化为二进制数。

第一步:
以小数点为界,分为整数和小数部分。
在该题中分为1和0.25两个部分。
第二步:
整数部分用除二取余法而小数部分用乘二取整法。
整数部分为1,小数部分为01。
第三步:
合并整数和小数部分。即1.01。

2.将二进制小数转为IEEE浮点数标准格式V

3.指数部分:实际指数值2加上一个(指数偏移值),对于32位单精度浮点数来说,偏移值为127,所以exponent值为127 + 2 = 129 ,二进制表示为10000001。

4.有效字位,又叫尾数,即2. 中二进制表示值的小数部分,即111101001,再补齐至23位,即得到fraction处位表示为:01000000000000000000000

5.结果0 10000001 01000000000000000000000。

2.浮点数的分类(根据阶码分类)

1:规格化的值

这是最普遍的,当exp的值不全为1或不全为0时皆为该情况。在这时,阶码字段被解释为以偏置形式表示的有符号整数,即E=e-Bias,e为无符号数,Bias=(2的k减一次方)减一。(k是阶码位,由该数的类型决定,若如float一样为单精度浮点型,则k的值为8;为双精度浮点型k的值则为16。M的值为1+f。

2:非规格化的值

当阶码域全为0时,为非规格化。阶码值E=1-Bias,尾数的值M=f,是小数字段的值,不包含隐含的1。

3:特殊值

当阶码全为1时,为该情况。
当小数域全为0时,得到的值为无穷,正负无穷取决于符号位s的值。
当小数域非零时,结果被称为“NAN”,即“Not a Number”。

3.浮点数的舍入

浮点数的舍入有向偶数舍入,向0舍入以及向上或向下舍入等方法,在面对不同情况时,他们都可能是最接近真实值的舍入方式。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值