我们看下面这段代码

  

  输出的结果的是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. Python3基础 add() 向集合中加入新的元素

    镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.-------------------------------------- ...

  2. vim中多行注释 和 删除多行注释

    1.多行注释:   a. 按下ctrl + v,进入列模式;   b. 在行首选择需要注释的行;   c. 按下"I",进入插入模式:  d. 然后输入注释符("//&q ...

  3. 字符集 ISO-8859-1(3)

    详细见 http://www.w3school.com.cn/tags/html_ref_urlencode.html

  4. js架构设计模式——MVC,MVP 和 MVVM 的图示及简单明了的区别说明

    MVC,MVP 和 MVVM 的图示 复杂的软件必须有清晰合理的架构,否则无法开发和维护. MVC(Model-View-Controller)是最常见的软件架构之一,业界有着广泛应用.它本身很容易理 ...

  5. 使AIX下ksh可以翻查上一条命令

    http://blog.csdn.net/wangjialiang/article/details/7106393 http://www.blogjava.net/03081626/archive/2 ...

  6. MyBatis java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符

    http://blog.sina.com.cn/s/blog_6da7fcff0101jewf.html 查看SQL语句是否多加了分号";"

  7. MVC 怎么把string字符串转译成html格式

    Views层下:

  8. SoapUI:使用Excel进行参数化

    本章中学习如下内容: 1)         使用DataSource调用Excel中的数据给接口参数化: 2)         使用DataSource Loop使得测试用例根据Excel中的取值循环 ...

  9. JTable 的使用

    JTable是Swing编程中的一种控件. 一.创建表格控件的各种方式:1) 调用无参构造函数. JTable table = new JTable(); 2) 以表头和表数据创建表格. Object ...

  10. Introduce: IEPI.BIATranscribe 图像表格拓写工具

    应用场合 数据表格是学术.文案工作中常用的表述形式.我们经常需要从第三方获取所需的数据.有些时候这些数据并非以可直接编辑的形式(如电子表格文档),而是以打印件或者扫描件的形式提供.假如需要对数据进行进 ...