码迷,mamicode.com
首页 > 编程语言 > 详细

javase学习-精度损失

时间:2021-04-15 12:41:57      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:反码   现在   过程   符号   计算   tar   容量   取值   inter   

javase学习-精度损失

1.数据类型转换

long x = 10L;
  • 10L是long类型字面值,x是long类型变量,不存在类型转换,直接赋值。

  

long x = 10L; // long类型,8个字节
int y = x // int类型,4个字节
  • 编译报错

  • 大容量数据类型不能直接赋值小容量数据类型

  • 大容量转换成小容量,需要进行强制类型转换,要加“强制类型转换符”

  • 进行强制类型转换后,编译通过,但在运行阶段可能会损失精度

    x = (int)y;

2.强转原理

int x = 10;
byte y = (byte)x;
  • 原始数据x: 00000000 00000000 00000000 00001010

  • 强转后数据y: 00001010

  • 将左边的二进制砍掉,得到y

  • 00001010目前储存在计算机内部,计算机存储数据都是采用补码的形式存储,所以00001010现在是一个补码形式

  • 将以上的补码转换成原码就是最终结果

  

byte a = 50; // 编译通过
byte b = 127; // 编译通过
  • 按当前所学知识,以上代码是无法编译通过的,理由:

    • 50是int类型的字面值,a是byte类型的变量,明显是大容量转换成小容量。

    • 大容量转换成小容量需要添加强制类型转换符,而以上程序并没有添加强制类型转换符,故应编译错误。

  • 但是,在实际编译过程中,以上程序是可以编译通过的,这说明:

    • 在java语言中,当一个整数型字面值没有超出byte类型取值范围时,该字面值可以直接赋给byte类型的变量。

byte c = 128; // 编译报错
  • 128这个int类型的字面值已经超出了byte类型的取值范围,故编译报错。

3.原码、反码、补码

表示法描述
原码 二进制定点表示法,最高位为符号位,“0”表示正数,“1”表示负数,其余位表示数值大小
反码 正数的反码与原码相同;负数的反码为原码符号位不变,其余位数字取反
补码 正数的补码与原码相同;负数的补码为其反码的末位加1
byte c = (byte)130;
  1. 求以上程序的结果

    1. 原始数据: 00000000 00000000 00000000 10000010

    2. 强转后(补码): 10000010

      1. 补码转反码再转原码: 10000001(补码减1)

                                           11111110(反码除符号位全部取反)

      2. 补码的补码:                11111101(除符号位全部取反)

                                           11111110(加1) = -126(字面值)

      3. 以上两个方法得到的结果一致,故原码=补码的补码

  • 在八位二进制下,-128不能用原码或反码表示,反码只能表示0到127,-0到-127;

  • 用补码表示为:10000000

  • 在八位整数里原码的取值范围为-127到+127,反码也是

  • 在八位二进制中就把-0当作最小数-128用,也就是10000000

    • -0的原码:10000000

    • -0的反码:11111111

    • -128的补码:10000000



javase学习-精度损失

标签:反码   现在   过程   符号   计算   tar   容量   取值   inter   

原文地址:https://www.cnblogs.com/TS-Prime/p/14660656.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!