强制类型转换之精度损失

精度损失:
         计算机二进制有三种表示形式:原码、反码、补码。
         三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。(第一位是符号位不参与计算,后面的是数值位)
         计算机在任何情况底层表示和数据存储都是补码形式。(所以说原码和反码都是过程码,都是为补码进行服务的,没有补码的话,原码和反码也就失去了存在价值!)
         原码:计算机对数字二进制定点表示方法。
         求正数的补码:和原码相同。
         求负数的补码:负数(除了符号位以外)对应的二进制码所有二进制全部取反,再加1。
取反:将原码中0全部变成1,将原码中全部1变成0。
为什么会出现这种情况呢?既然有了原码为什么计算机底层存储还要使用补码形式来存储呢?
         其实最主要的原因是,按照原码的表示形式,得到的负数原码和与之对应的正数原码相加,所到的结果并不是零!

按照只有原码的逻辑:

byte类型 4 的二进制为00000100
byte类型 -4 的二进制为10000100
两者相加得到:10001000 ——>结果为-8而不是0

所以只有原码的情况是无法解决负数问题的,那么
byte类型 4 的二进制为00000100  
加上
byte类型-4 的二进制为????????
结果会是0呢?二进制表示00000000
答案是:
byte类型 4 的二进制为11111100  

多次列举:

1的二进制:00000001
2的二进制:00000010
3的二进制:00000011

-1的二进制:11111111
-2的二进制:11111110
-3的二进制:11111101
所以总结负数的规律就是:先把十进制的负数取绝对值,然后再转换为二进制,然后按位取反,最后再+1

所以解决了负数问题的,那么就可以使用补码来解决数据在底层的存储问题了!

那么接下来看一下精度损失问题,
例如:byte取值范围是[-128,127]那么给byte赋值128和129会怎么样呢?

byte b1 = (byte)128;
byte是1字节的!

那么128的二进制补码是多少呢?
可以先看成127+1的形式,其对应补码相加为
01111111+00000001
得到补码:10000000

但是第一位是符号位,符号位为1,则说明是负数,那么就得按照负数的补码来倒推所对应的十进制数值。
所以先10000000减一,得到01111111
然后按位取反得到10000000
1在第八位上,则27次方为128
最后去绝对值,得到-128

byte b2 = (byte)129;

那么128的二进制补码是多少呢?
10000001

但是第一位是符号位,符号位为1,则说明是负数,那么就得按照负数的补码来倒推所对应的十进制数值。
所以先10000000减一,得到10000000
然后按位取反得到01111111
最后去绝对值,得到-127
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
自动类型转换,也称隐式类型转换,是指不需要书写代码,由系统自动完成的类型转换。由于实际开发中这样的类型转换很多,所以Java语言在设计时,没有为该操作设计语法,而是由JVM自动完成。 转换规则 从存储范围小的类型到存储范围大的类型。 具体规则为: byte→short(char)→int→long→float→double 也就是说byte类型的变量可以自动转换为short类型,示例代码: byte b = 10; short sh = b; 这里在赋值时,JVM首先将b的值转换为short类型,然后再赋值给sh。 在类型转换时可以跳跃。示例代码: byte b1 = 100; int n = b1; l 注意问题 在整数之间进行类型转换时,数值不发生改变,而,特将整数类型别是比较大的整数类型转换成小数类型时,由于存储方式不同,有可能存在数据精度损失强制类型转换,也称显式类型转换,是指必须书写代码才能完成的类型转换。该类类型转换很可能存在精度损失,所以必须书写相应的代码,并且能够忍受该种损失时才进行该类型的转换。 转换规则 从存储范围大的类型到存储范围小的类型。 具体规则为: double→float→long→int→short(char)→byte 语法格式为: (转换到的类型)需要转换的值 示例代码: double d = 3.10; int n = (int)d; 这里将double类型的变量d强制转换成int类型,然后赋值给变量n。需要说明的是小数强制转换为整数,采用的是“去1法”,也就是无条件的舍弃小数点的所有数字,则以上转换出的结果是3。整数强制转换为整数时取数字的低位,例如int类型的变量转换为byte类型时,则只去int类型的低8位(也就是最后一个字节)的值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值