我们看下面这段代码

  

  输出的结果的是128,这个没什么疑问

    

  但是当我们不改变数值仅仅加了一个强制转换后

  

  这时我们会发现结果会变成负的128.这时候我们就要怀疑了,为什么会出现这样的结果呢?

    

  对于这个问题,我们就要深入到计算机的组成原理中去了。计算机存储数据是用二进制的0和1代码存储的,也就是硬件层面的高低电平。但是在用户编程层面,我们仍然是用着我们习惯的十进制或者其它方便计算的进制的进行编程的。在java的基本数据类型中,byte类型的大小是一个字节即8个比特,放到计算中存储就是8个存储空间,每个存储空间可以放0或者1;同理int类型是四个字节大小,即32个bit大小。计算机为了方便表示数的正负时将数的二进制码的最高位作为数的正负表示,通常是0表示正数,1表示负数。这样在真正在表示数时候只有比原类型总共空间大小少一位的位数来表示,例如int型的数据空间大小是32,但只有31个空间用来表示数值部分的,最高位用来表示正负。同时又为了方便进行数值的加减操作,引入了补码这个概念,补码是在源码的基础上除符号位外进行的各位取反后再加1获得的,但是正数的补码是不变的,还是源码本身。例如10的源码(01010)B,补码也是(01010)B,-10的源码是(11010)B,补码则是(10110)B,计算机存储时,存的就是-10的补码(10110)B,而不是(11010)B.

  弄清楚这个后,我们再来看int型的128在计算机中存储二进制码是0000 0000 0000 0000 0000 000 1000 0000 占据空间为32,最高位0表示这个数是正数,但是当我们强制转换这个int型的数据为byte型,由于byte型只占据一个字节8个比特的空间,就只会截取int型数据的低八位空间中的数据作为新的数据,高位舍弃,也就是1000 0000,此时这里面的1表示这个新的数据是个负数,而且是补码形式,要算出原数值就要先-1得0111 1111再各位取反是1000 0000,这个值就是真实值的绝对值128,加上符号后就是-128. 因此在进行强制转换时我要要注意数据的溢出问题。

最新文章

  1. BPM端到端流程解决方案分享
  2. freemarker 数据做加减计算
  3. 【读书笔记】Ninject 在MVC5中的使用
  4. 使用Intellij idea开发
  5. 烂泥:【解决】ubuntu提示ilanni不在sudoers文件中错误
  6. 关于git reset和git revert之前的区别
  7. java.util.Hashtable源码分析
  8. JavaScript的问题
  9. 【转】VS调试技巧
  10. Android 获取imageview的图,在另一个imageview里显示。
  11. (八)boost库之异常处理
  12. android版本 busybox
  13. 转换number为千分位计数形式js
  14. JavaScript 的if语句和==的判断
  15. 纯CSS3超酷3D旋转立方体动画特效
  16. (4).NET CORE微服务 Micro-Service ---- Consul服务发现和消费
  17. HttpWebResponse远程服务器返回错误: (500) 内部服务器错误 的解决办法
  18. 洛谷P4562 [JXOI2018]游戏(组合数学)
  19. about use Vue of methods
  20. [转]vue全面介绍--全家桶、项目实例

热门文章

  1. nlpir分词器过期处理
  2. osgearth earth文件规范-符号参考
  3. ThinkPHP框架开发的应用的标准执行流程
  4. Win10下CISCO VPN Client无法安装解决方案
  5. pureMVC简单示例及其原理讲解一(开篇)
  6. ARPU值分析
  7. 负载均衡软件LVS分析一(概念)
  8. apache软件包下载地址
  9. 微信小程序维护登录态与获取用户信息
  10. 使用php实现网站验证码功能【博主推荐】