关于java中强制转换
在百度上遇到一个问题,描述如下:
在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中强制转换的更多相关文章
- c#中的里氏转换和Java中强制类型转换在多态中的应用
在c#中: 注意: 子类并没有继承父类的构造函数,而是会默认调用父类那个无参数的构造函数. 如果一个子类继承了一个父类,那么这个子类除了可以使用自己的成员外,还可以使用从父类那里继承过来的成员.但是父 ...
- java中强制类型转换
在Java中强制类型转换分为基本数据类型和引用数据类型两种,这里我们讨论的后者,也就是引用数据类型的强制类型转换. 在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需 ...
- Java父类强制转换子类原则
最近,微信群友在讨论子类父类的转换问题,其实不难,给大家用实例来说明一下就很明了了. 我们知道Java中子类转换成父类是没有任何问题的,那父类可以转换成子类吗? 来看下面这段程序: public cl ...
- Java中String转换Double类型 Java小数点后留两位
Java中String转换Double类型 double num1 = 0.0; String qq = "19.987"; num1 = Double.valueOf(qq.to ...
- Java中byte转换int时与0xff进行与运算的原因
http://w.baike.com/LGAdcWgJBBQxRAHUf.html 转帖 java中byte转换int时为何与0xff进行与运算 在剖析该问题前请看如下代码 public static ...
- 关于Java中强制类型转换的问题
为了更好的理解我们先看下面的例子: package com.yonyou.test; import java.util.ArrayList; import java.util.Iterator; im ...
- java中byte转换int时为何与0xff进行与运算
在剖析该问题前请看如下代码 public static String bytes2HexString(byte[] b) { String ret = ""; for (int ...
- Java中十六进制转换 Integer.toHexString()
为了显示一个byte型的单字节十六进制(两位十六进制表示)的编码,请使用: Integer.toHexString((byteVar & 0x000000FF) | 0xFFFFFF00).s ...
- [转]java中byte转换int时为何与0xff进行与运算
在剖析该问题前请看如下代码public static String bytes2HexString(byte[] b) { String ret = ""; for (int ...
随机推荐
- 让你提前知道软件开发(24):C语言和主要特征的发展史
文章1部分 再了解C语言 C语言的发展历史和主要特点 作为一门众所周知的计算机编程语言,C语言是谁发明的呢?它是怎样演进的?它有何特点?究竟有多少人在使用它? 1. C语言之父 C语言是1972年由美 ...
- css6种隐藏元素的方法
6种方式可以隐藏一个元素: 1 CSS display的值是none.(该元素是不会在页面上显示) 2 type="hidden"的表单元素.(该元素是不会在页面上显示) ...
- struts2+hibernate环境搭建
使用的是myeclipse2014,搭建比较简单,很多jar包不用自己引入,很多初始配置文件不需要自己写.后面会介绍ssh的搭建. 首先新建web project. 1.右键项目,如图所示 这个直接f ...
- POJ 3167 Cow Patterns(模式串浮动匹配)
题目链接:http://poj.org/problem?id=3167 题意:模式串可以浮动的模式匹配问题给出模式串的相对大小,需要找出模式串匹配次数和位置. 思路:统计比当前数小,和于当前数相等的, ...
- .NET中的IO操作之文件流(一)
读操作 //1.创建文件流 FileStream fsRead =new FileStream("1.txt",FileMode.Open); //2.创建缓冲区,正常情况下,是不 ...
- Maven Spring JUnit 在Maven Clean Install时报
问题: Maven Clean Install时, 遇到报错package org.junit does not exist 明显, Unit Test在Compile阶段就被检查了. 而POM.xm ...
- Structs
1.服务端的运行程序 2.Servlet的三个方法 init service:抽象方法 destroy 3.步骤 (1).在web.xml中 <servlet> <servlet-n ...
- css3 display:box
想做自适应的流体布局 box很有用 . 还没有得到firefox.Opera.chrome浏览器的完全支持,但可以使用它们的私有属性定义firefox(-moz-).opera(-o-).chrome ...
- 运用DIV拖拽实现resize和碰撞检测
运用DIV拖拽实现resize和碰撞检测 Div由拖拽改变大小 演示demo 当我们运用html元素"textarea"写一个文本输入框时,浏览器会自动生成以下样式 用鼠标拖动右下 ...
- A Byte of Python 笔记(4)控制流:if、for、while、break、continue
第6章 控制流 3种控制流语句-- if for while 默认pyhon使用ASCII码来解释程序的,默认不支持中文,需要在程序的第一行或者第二行声明编码.官方参考具体参考以下三种方式:1. ...