• 关于byte和int的强制转换


    在编程遇到一个问题,描述如下:

    在java中,定义两个变量

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

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

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

    这种问题在刚开始学习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表示数值,为127

    所以结果就是127.

    注:byte取出时不用转经过补码-->原码的过程

    原博地址:https://www.cnblogs.com/YESheng/p/3337725.html

  • 相关阅读:
    JBoss目录结构说明
    Velocity简介
    如何把文件上传到另外一台服务器
    控制GridView列显示
    CheckBoxList取值及勾选上
    Email发送中不允许使用邮箱名称原因
    关于URL重写的一点心得
    修改数据库所有者
    验证CheckBoxList至少要有一项选中
    SQL中字符串处理(分割及反分割)
  • 原文地址:https://www.cnblogs.com/hirampeng/p/9122897.html
Copyright © 2020-2023  润新知