计算机存储负数以及int转byte时-128的出现
我们看下面这段代码

输出的结果的是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的出现的更多相关文章
- 计算机基础--Java中int char byte的关系
计算机基础--Java中int char byte的关系 重要:一个汉字占用2byte,Java中用char(0-65535 Unicode16)型字符来存字(直接打印输出的话是字而非数字),当然要用 ...
- int类型转换byte类型
计算机中,int类型占用4个字节,byte类型占用1个字节: 当int类型强转为byte类型时,计算机会截取最后的八位(1个字节): 由于计算机存储数据时,都是以补码的形式进行存储. 然而,我们通常看 ...
- sql server数据库如何存储数组,int[]float[]double[]数组存储到数据库方法
原文地址:https://www.zhaimaojun.top/Note/5475296 将数组存储到数据库的方法 (本人平时同csharp编写代码,所以本文中代码都是csharp代码,有些地方jav ...
- java笔记--关于int和byte[]的转换
关于int和byte[]数组的转换 --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3891747.html "谢谢-- 众所 ...
- int与byte的区别
Java中涉及byte.short和char类型的运算操作首先会把这些值转换为int类型,然后对int类型值进行运算,最后得到int类型的结果.因此,如果把两个byte类型值相加,最后会得到一个int ...
- int跟byte[]数组互转的方法,整数 + 浮点型
整数: int转byte数组 public static byte[] intToBytes2(int n){ ]; ;i < ;i++) { b[i]=(-i*)); } return b; ...
- C# int转byte[],byte[]转int
第一种方法: byte数组转int u = (uint)(b[0] | b[1] << 8 |b[2] << 16 | b[3] << 24); int转byte数 ...
- java中的int与byte的转化
java中的int与byte的转化 1.基础准备 1.1.原码 就是二进制码,最高位为符号位,0表示正数,1表示负数,剩余部分表示真值 1.2.反码 在原码的基础上,正数反码就是他本身,负数除符号位之 ...
- Java中用反码表示整数,及int到byte的转换
Java中的整数都是通过补码表示的,当整数为正数时,补码和原码相同,当整数为负数时,补码为原码按位取反(符号位除外),然后加1. 通过一些例子可以比较明显的看出: int a = -1; System ...
随机推荐
- NSBundle介绍
原文:http://blog.sina.com.cn/s/blog_8c87ba3b0100t89v.html bundle是一个目录,其中包含了程序会使用到的资源. 这些资源包含了如图像,声音,编译 ...
- 请使用支持 JDBC 4.0 的 sqljdbc4.jar 类库
转载请使用支持 JDBC 4.0 的 sqljdbc4.jar 类库 1.下载最新的JDBC(2012/3/6) http://www.microsoft.com/downloads/zh-cn/de ...
- PHP连接和拆分数组array_combine()和array_slice()用法示例
一提起数组,可能很多PHP初学者会觉得难,但开发一些高级应用的时候,又离不开数组的使用.下面就来说下,PHP使用array_combine()函数来连接数组.用array_slice()函数来拆分数组 ...
- iOS 之 UITextView
_lableAssess = [[UITextView alloc] init]; [_lableAssess setFrame:CGRectMake(left2, top2, width2, siz ...
- Myeclipse快捷键集合
Ctrl+1 快速修复(最经典的快捷键,就不用多说了)Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加)Ctrl+Alt+↑ 复制当前行到上一行(复制增加)Alt+↓ 当 ...
- --@angularJS--angular与BootStrap3的应用
angularJS与BootStrap3是最佳搭档. 1.Form.html: <!doctype html><html ng-app="UserInfoModule&qu ...
- void 0 === undefined
http://www.cnblogs.com/fsjohnhuang/p/4146506.html
- LIS算法
LIS(Longest Increasing Subsequence)最长上升(不下降)子序列. 1. O(n^2) #include<cstdio> #include<algori ...
- SVG的Transform使用
SVG的Transform使用: <%@ page language="java" contentType="text/html; charset=UTF-8&qu ...
- HTTPS=HTTP + SSL / TLS
以下的两个链接作为本次编辑的参考 https://www.bennythink.com/school-1.htmlhttps://www.bennythink.com/school-2.html 应一 ...