我们看下面这段代码

  

  输出的结果的是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. 因此在进行强制转换时我要要注意数据的溢出问题。

计算机存储负数以及int转byte时-128的出现的更多相关文章

  1. 计算机基础--Java中int char byte的关系

    计算机基础--Java中int char byte的关系 重要:一个汉字占用2byte,Java中用char(0-65535 Unicode16)型字符来存字(直接打印输出的话是字而非数字),当然要用 ...

  2. int类型转换byte类型

    计算机中,int类型占用4个字节,byte类型占用1个字节: 当int类型强转为byte类型时,计算机会截取最后的八位(1个字节): 由于计算机存储数据时,都是以补码的形式进行存储. 然而,我们通常看 ...

  3. sql server数据库如何存储数组,int[]float[]double[]数组存储到数据库方法

    原文地址:https://www.zhaimaojun.top/Note/5475296 将数组存储到数据库的方法 (本人平时同csharp编写代码,所以本文中代码都是csharp代码,有些地方jav ...

  4. java笔记--关于int和byte[]的转换

    关于int和byte[]数组的转换 --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3891747.html "谢谢-- 众所 ...

  5. int与byte的区别

    Java中涉及byte.short和char类型的运算操作首先会把这些值转换为int类型,然后对int类型值进行运算,最后得到int类型的结果.因此,如果把两个byte类型值相加,最后会得到一个int ...

  6. int跟byte[]数组互转的方法,整数 + 浮点型

    整数: int转byte数组 public static byte[] intToBytes2(int n){ ]; ;i < ;i++) { b[i]=(-i*)); } return b; ...

  7. C# int转byte[],byte[]转int

    第一种方法: byte数组转int u = (uint)(b[0] | b[1] << 8 |b[2] << 16 | b[3] << 24); int转byte数 ...

  8. java中的int与byte的转化

    java中的int与byte的转化 1.基础准备 1.1.原码 就是二进制码,最高位为符号位,0表示正数,1表示负数,剩余部分表示真值 1.2.反码 在原码的基础上,正数反码就是他本身,负数除符号位之 ...

  9. Java中用反码表示整数,及int到byte的转换

    Java中的整数都是通过补码表示的,当整数为正数时,补码和原码相同,当整数为负数时,补码为原码按位取反(符号位除外),然后加1. 通过一些例子可以比较明显的看出: int a = -1; System ...

随机推荐

  1. UVa 10720 - Graph Construction

    题目大意:给n个整数, 分别代表图中n个顶点的度,判断是否能构成一张图. 看到这个题后,除了所有数之和应该为偶数之外,没有别的想法了,只好在网上搜解题报告了.然后了解了Havel-Hakimi定理.之 ...

  2. 7.广播和多播,IGMP协议

    1.单播,多播,广播的介绍 1.1.单播(unicast) 单播是说,对特定的主机进行数据传送.例如给某一个主机发送IP数据包.这时候,数据链路层给出的数据头里面是非常具体的目的地址,对于以太网来 说 ...

  3. jQuery仿淘宝图片无缝滚动轮播

    自己前天,也就是1月8日的时候早上自己写了一个图片滚动轮播(基于jQuery). 其实几个月以前就有朋友问过我怎么做出和淘宝上面一样的滚动轮播,一直到现在也没有真正的写好,这次写得差不多了. 但是还有 ...

  4. CSS3 :target伪类实现Tab切换效果 BY commy

    http://www.shejidaren.com/examples/css3-target/css3-target.html#tab1 标签一 标签二 标签三 欢迎加设计达人Q群:50063010设 ...

  5. 使用spring的JavaMailSender发送邮件

    一:pom.xml <!-- java邮件 -->      <dependency>          <groupId>javax.mail</group ...

  6. ThinkPHP 3 MVC模式和URL访问

    一.什么是MVC                 //了解    M -Model 编写model类 对数据进行操作    V -View  编写html文件,页面呈现    C -Controlle ...

  7. 使用IDA静态分析解密《舰娘Collection》的lua脚本

    好久没写东西了,换工作之后忙得一比.你说创业?风太大没听清啊看了看以前写的东西,觉得以前写得太严肃了,从现在开始要轻松一点,要做一名逗逼码农. 本文不会介绍破解的细节,最终完成破解所编写的代码也不会公 ...

  8. BNU Online Judge-29140

    题目链接 http://www.bnuoj.com/bnuoj/problem_show.php?pid=29140 看到这样的题,应该想到an  与an-1  的关系,他们是会有关系的你要去找 代码 ...

  9. Android离线缓存

    android做到一定程度,需要考虑缓存的问题,不信可以掏出手机看看淘宝等一些app是否无网的情况下还可以浏览,不过大部分app并没有考虑到这些问题,解决Android的缓存有哪些方法呢 1.IO流读 ...

  10. 我的小工具开源一下-PingTest

    v博客前言 先交代下背景,最近我们项目组的网络真是太渣了,时常remote不了另外一个地方的机器,过个几分钟就断开连接,太烦躁了,严重影响工作心情...于是想着做个工具记录下每天的断开remote连接 ...