在百度上遇到一个问题,描述如下:

在java中,定义两个变量

byte x = (byte) 128;
byte y = (byte)-129;

输出后,为什么结果是-128和128?

借此机会,自己也认真的思考了一下这个问题,并得出了正确的结果,下面就谈谈我的理解。

这种问题在刚开始学习java的时候确实令我很费解来的,因为如果只是局限在java语言本身中,这个问题是没法得到真正的解的,顶多也是知其然不知其所以然。一年多来对计算机系统的更深入的学习,我在现可以尝试着去解答这个问题了。

首先你要知道,在计算机中数是以二进制形式存在的,而且可以有三种表示方式,原码,反码,补码。

首先讨论第一个数128。java中默认整数是int类型(4字节长)的,并且在机器中用补码表示,所以它在计算机内部存储的二进制串为:

00000000 00000000 00000000 10000000

这是128的二进制补码形式,一共是四字节,32位,其中最高位0为符号位,代表正数。

这时候对128进行强制类型转换,因为byte只有1字节,即8位,所以这个二进制串就要被截短,截取的规则是:只保留低8位:

10000000

被截取掉的只是1前面的24个0,看起来好像并没有影响数据大小,但这个时候的二进制串还表示128吗?

不是了,因为byte的最高位也是符号位!也就是说现在1被用来作符号位了,即代表是负数, 后面的7个0000000才用来表示数值,结合起来1 0000000 代表的就是-128。

所以这就是为什么128强制转换类型后会变成-128的原因,知道了这点,其他情况的类型转换也是可以类似分析的。

比如看下-129的情况

-129依然是存储为四字节,它的原码为:10000000 00000000 00000000 10000001

不过计算机中存储的是补码形式,所以它存储的二进制串为:11111111 11111111 11111111 01111111

还是一样的,强制转换,只保留低低八位:01111111

最高位同样为符号位,即0,表示为正数,1111111表示数值,为128

所以结果就是128.

关于java中强制转换的更多相关文章

  1. c#中的里氏转换和Java中强制类型转换在多态中的应用

    在c#中: 注意: 子类并没有继承父类的构造函数,而是会默认调用父类那个无参数的构造函数. 如果一个子类继承了一个父类,那么这个子类除了可以使用自己的成员外,还可以使用从父类那里继承过来的成员.但是父 ...

  2. java中强制类型转换

    在Java中强制类型转换分为基本数据类型和引用数据类型两种,这里我们讨论的后者,也就是引用数据类型的强制类型转换. 在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需 ...

  3. Java父类强制转换子类原则

    最近,微信群友在讨论子类父类的转换问题,其实不难,给大家用实例来说明一下就很明了了. 我们知道Java中子类转换成父类是没有任何问题的,那父类可以转换成子类吗? 来看下面这段程序: public cl ...

  4. Java中String转换Double类型 Java小数点后留两位

    Java中String转换Double类型 double num1 = 0.0; String qq = "19.987"; num1 = Double.valueOf(qq.to ...

  5. Java中byte转换int时与0xff进行与运算的原因

    http://w.baike.com/LGAdcWgJBBQxRAHUf.html 转帖 java中byte转换int时为何与0xff进行与运算 在剖析该问题前请看如下代码 public static ...

  6. 关于Java中强制类型转换的问题

    为了更好的理解我们先看下面的例子: package com.yonyou.test; import java.util.ArrayList; import java.util.Iterator; im ...

  7. java中byte转换int时为何与0xff进行与运算

    在剖析该问题前请看如下代码 public static String bytes2HexString(byte[] b) {  String ret = "";  for (int ...

  8. Java中十六进制转换 Integer.toHexString()

    为了显示一个byte型的单字节十六进制(两位十六进制表示)的编码,请使用: Integer.toHexString((byteVar & 0x000000FF) | 0xFFFFFF00).s ...

  9. [转]java中byte转换int时为何与0xff进行与运算

    在剖析该问题前请看如下代码public static String bytes2HexString(byte[] b) {  String ret = "";  for (int ...

随机推荐

  1. 脑波设备mindwave TGCD接口开发示例

    对于TGCD的开发,神念科技提供的文件包括,头文件thinkgear.h,thinkgear.lib,thinkgear.dll,有这三个文件,在win32下开发就不是什么难事了吧 如果是java语言 ...

  2. Hibernate 配置详解(12) 补充

    hibernate.hbm2ddl.import_files_sql_extractor 这个配置项用于补充这篇文章: http://blog.csdn.net/stefwu/article/deta ...

  3. 使用资源监控工具 glances

    http://www.ibm.com/developerworks/cn/linux/1304_caoyq_glances/ glances 可以为 Unix 和 Linux 性能专家提供监视和分析性 ...

  4. String、StringBuffer和StringBuild的区别

    public class Test1 { public static void stringReplace (String text) { text = text.replace('j','i') ; ...

  5. HDU1046:Gridland

    Problem Description For years, computer scientists have been trying to find efficient solutions to d ...

  6. 关于反射的一个小问题---.NetFrameWork版本不一样导致不同的系统的问题

    背景: 近期项目中用到发射,本人的电脑上是安装了.NetFrameWork 4.5,然后用着发射蛮顺溜的,啪啪,三下五除二,项目完成了,然后提交测试了,测试的电脑是虚拟机上安装了xp系统,然后.Net ...

  7. 线段树讲解(数据结构、C++)

    声明    : 仅一张图片转载于http://www.cnblogs.com/shuaiwhu/archive/2012/04/22/2464583.html,自己画太麻烦了...那个博客的讲解也很好 ...

  8. (转)经典线程同步 互斥量Mutex

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...

  9. LOJ 1370 Bi-shoe and Phi-shoe(欧拉函数的简单应用)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1370 题意:给你n个整数,第i个整数为Xi.定义phi(k)为k的欧拉函数值,设pi为 ...

  10. PGA与SGA

    当用户进程连接到数据库并创建一个对应的会话时,Oracle服务进程会为这个用户专门设置一个PGA区,用来存储这个用户会话的相关内容.当这个用户会话终止时,数据库系统会自动释放这个PAG区所占用的内存. ...