先举三个栗子:

1.

  1. public static void main(String[] args) {
  2. Double d = new Double(123.56);
  3.  
  4. byte b = d.byteValue();
  5.  
  6. System.out.println(b);
  7. }

输出结果:123

2.

  1. public static void main(String[] args) {
  2. Double d = new Double(456.56);
  3.  
  4. byte b = d.byteValue();
  5.  
  6. System.out.println(b);
  7. }

输出结果:-56

3.

  1. public static void main(String[] args) {
  2. Double d = new Double(567.56);
  3.  
  4. byte b = d.byteValue();
  5.  
  6. System.out.println(b);
  7. }

输出结果:55

大家应该看出来了吧,这三个只是Double的整数位变化了,但输出结果却差不少,而且一眼是看不出来规律的

原因解析:1.翻源码,看看byteValue()是咋处理的

上源码:

  1. /**
  2. * Returns the value of this {@code Double} as a {@code byte}
  3. * after a narrowing primitive conversion.
  4. *
  5. * @return the {@code double} value represented by this object
  6. * converted to type {@code byte}
  7. * @jls 5.1.3 Narrowing Primitive Conversions
  8. * @since JDK1.1
  9. */
  10. public byte byteValue() {
  11. return (byte)value;
  12. }

惊不惊喜!意不意外!没错,就是强转了

2.Double强转byte时的操作过程

记住这句话:正整数在计算机中用原码来表示的,而负整数在计算机中用补码来表示的

1  取整

2  整数部分与[256]取模

3.1 如果该整数在[-128,127]之间,直接打印

3.2 如果该整数在[-128,127]之外,将这个值化为二进制,判断第一位是1还是0

  3.2.1   如果是1,表明该数为一个负数

  3.2.2   如果是0,表明该数为一个正数

好了,概念说完了,回头理解一下最开始举的栗子

先说第一个:

123.45  -->  取整  123  -->  整数部分与[256]取模  123  -->  在[-128,127]区间内  -->  打印输出

第一个最简单了,很容易理解,接下来讲第三个

注意啊,是第三个(因为第二个比较难,放在最后讲)

567.56  -->  取整  567  -->  整数部分与[256]取模  55  -->  在[-128,127]区间内  -->  打印输出

看,其实第一个和第三个是同样原理,接下来分析第二个

456.56  -->  取整  456  -->  整数部分与[256]取模  200  -->  在[-128,127]区间外

在区间外,所以我们将 200 转为二进制来看

200二进制为 ‭1100 1000‬

第一位为1,也就是说这个数是个负数,还记得上面标粗体的让记住的那就话了么

记住这句话:正整数在计算机中用原码来表示的,而负整数在计算机中用补码来表示的

所以,这个 1100 1000‬ 其实存的是一个补码,我们根据补码算出原码

计算法则:

补码的补码就是原码

二、负整数的符号位固定为1,由原码变为补码时,规则如下:

      1、原码符号位1不变,整数的每一位二进制数位求反,得到反码

  1011 0111

      2、反码符号位1不变,反码数值位最低位加1,得到补码

  1011 1000

根据此数求出十进制的值

1*2^3 + 1*2^4 + 1*2^5 = 8 + 16 + 32 = 56

由于第一位为1,结果为负,即 -56

Double如果是负数也同样适用

声明:本文中未加粗的斜体摘自百度经验,其他原创手打,如需转载,请联系我本人

byte在计算机中的存储方式--Double.byteValue()的输出结果思考的更多相关文章

  1. java 20 - 8 字节流的文件复制以及汉字在计算机中的存储方式

    复制文本文件:把当前目录下的FileIntputStream.java文件里面的内容复制到当前目录的b.txt文件中 分析: 数据源: FileIntputStream.java -- 读取数据 -- ...

  2. C语言中浮点数在内存中的存储方式

    关于多字节数据类型在内存中的存储问题 //////////////////////////////////////////////////////////////// int ,short 各自是4. ...

  3. <转载>浅谈C/C++的浮点数在内存中的存储方式

    C/C++浮点数在内存中的存储方式 任何数据在内存中都是以二进制的形式存储的,例如一个short型数据1156,其二进制表示形式为00000100 10000100.则在Intel CPU架构的系统中 ...

  4. QList介绍(QList比QVector更快,这是由它们在内存中的存储方式决定的。QStringList是在QList的基础上针对字符串提供额外的函数。at()操作比操作符[]更快,因为它不需要深度复制)非常实用

    FROM:http://apps.hi.baidu.com/share/detail/33517814 今天做项目时,需要用到QList来存储一组点.为此,我对QList类的说明进行了如下翻译. QL ...

  5. Float在内存中的存储方式及IEC61131处理

    Float在内存中的存储方式及IEC61131处理 1,fp32(32bits float)类型数据在存储器中占用4Bytes存储,且遵循IEEE-754标准: 一个浮点数分三部分组成: 符号位s(1 ...

  6. YbSoftwareFactory 代码生成插件【二十五】:Razor视图中以全局方式调用后台方法输出页面代码的三种方法

    上一篇介绍了 MVC中实现动态自定义路由 的实现,本篇将介绍Razor视图中以全局方式调用后台方法输出页面代码的三种方法. 框架最新的升级实现了一个页面部件功能,其实就是通过后台方法查询数据库内容,把 ...

  7. float和double在内存中的存储方式

    本文转载于:http://wenku.baidu.com/link?url=ARfMiXVHCwCZJcqfA1gfeVkMOj9RkLlR9fIexbgs9gDdV8rIS48A1_xe1y6YgX ...

  8. C语言 float、double数据在内存中的存储方式

    float在内存中占4个字节(32bit),32bit=符号位(1bit)+指数位(8bit)+底数位(23bit) 指数部分 指数位占8bit,可以表示数值的范围是0-(表示0~255一共256个数 ...

  9. C/C++浮点数在内存中的存储方式

    一.内存表示 任何数据在内存中都是以二进制的形式存储的,浮点数的表示是把一个数的有效数字和数的范围在计算机的一个存储单元中分别予以表示,数的小数点位置随比例因子的不同而在一定范围内自由浮动.如下图是3 ...

随机推荐

  1. 用MATLAB结合四种方法搜寻罗马尼亚度假问题

    选修了cs的AI课,开始有点不适应,只能用matlab硬着头皮上了,不过matlab代码全网仅此一份,倒有点小自豪. 一.练习题目 分别用宽度优先.深度优先.贪婪算法和 A*算法求解"罗马利 ...

  2. Cracking Wifi Wpa-Wpa2 in 5 second——Dumpper V.80.8 +JumpStart+WinPcap

    标题虽然说是5秒之内破解wpa-wpa2的wifi密码,不过其实这个是针对外国的那种路由器,我们大天朝的路由器越来越强悍了.有的路由器防pin,甚至于一些路由器没有pin,wps之类的.不过还是有一些 ...

  3. 功能性AI术语表

    算法:一套计算机要遵循的指令.一个算法可以是一个简单的单步程序也可以是一个复杂的神经网络,但是通常被用来指一个模型. 人工智能:这是一个统称.广义上说,软件意味着模仿或取代人类智能的各个方面.人工智能 ...

  4. 【Flask】 flask-socketio实现WebSocket

    [flask-socektio] 之前不知道在哪个场合下提到过如何从web后台向前台推送消息.听闻了反向ajax技术这种模式之后,大呼神奇,试了一下之后发现也确实可以用.不过,反向ajax的代价也很明 ...

  5. MSIL实用指南-生成构造函数

    本篇讲解生成构造函数的一些知识,包括创建实例构造函数.静态构造函数.调用父类构造函数. 生成构造函数的方法生成构造函数的方法是TypeBuilder.DefineConstructor(MethodA ...

  6. CAS简介和无锁队列的实现

    Q:CAS的实现 A:gcc提供了两个函数 bool __sync_bool_compare_and_swap (type *ptr, type oldval, type newval, ...)// ...

  7. WPF学习笔记2

    XML语言中添加注释为<!---->,这是和C#不同的,但是和HTML十分相似. XAML是一种基于XML的标记语言,每一个XML元素代表.NET控件的一个对象,XML元素的属性可以是.N ...

  8. SQLite学习手册(数据表和视图)

    如何列出SQLite数据库中的所有表 SQLite数据库中的信息存在于一个内置表sqlite_master中,在查询器中可以用 select * from sqlite_master 来查看,如果只要 ...

  9. win10下NeuralStyle的tensorflow版实验

    ---恢复内容开始--- 首先配置win10下的tensorflow-gpu的运行环境,然后在github上将NeuralStyle拷贝下来,最后根据文档说明参数,运行文件,即可得到自己喜欢的styl ...

  10. Hibernate学习笔记四 查询

    HQL语法 1.基本语法 String hql = " from com.yyb.domain.Customer ";//完整写法 String hql2 = " fro ...