黑马程序员技术交流社区
标题:
班主任交代,一定要写两篇帖子之其一
[打印本页]
作者:
czl753951
时间:
2018-10-8 23:42
标题:
班主任交代,一定要写两篇帖子之其一
作为杭州JAVAEE19期的一个萌新
我来给班主任——
婧芸小姐姐交作业辣。
上了几天基础课,内容还是比较简单易懂的,技术贴好像没法写
没办法,我只有写点这几天基础课上某些知识点的拓展知识咯(童鞋们,仅供了解就好。大神的话就无视此贴吧)。
接下来是正题:
原码、反码、补码
先不急着说,这些是神马鬼。
之前课上讲的8种基本数据类型,其对应的所占字节,所占位数,如图
我们也知道了各个基本数据类型的取值范围。拿byte来说,其取值范围是-128~127。为啥是这个值呢?就不能是其他的值?
因为,计算机只认识二进制数(即只知道0,1)一位只能表示2种,不是0就是1。而byte占了8位,可以从取[0000 0000]~[1111 1111](二进制)之间的值。[1111 1111](二进制)换算成十进制就是255,那么byte对应十进制的取值应该是0~255呀?怎么会变成-128~127呢?
其实,计算机默认最左边的一位(最高位)是符号位:0表示正 ,1表示负。([
0
000 0000]~[
1
111 1111],标记成红色的那一位决定了这个数的正负号),所以byte的最大值用二进制表示应该是[
0
111 1111],换算成十进制就是127。那么最小值是啥呢?是[
1
111 1111]还是[
1
000 000]呢?
前者,最高位是1,代表负数,剩下的部分转换成 十进制是127,最终结果是-127。这和我们学到的结论不一致呀!-128是怎么 来的啊?
啊哈哈,一个冲击性的事实,[
1
000 000]这个二进制在计算机中就是-128。这个才是最小值哟,至于为什么?好,“
原码、反码、补码
“出场了。
原码:
就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。
反码:
表示方法是:
正数
的反码是
其本身
;
负数
的反码是在其
原码的基础上, 符号位不变,其余各个位取反
。
补码:
表示方法是:
正数
的补码就是
其本身
;
负数
的补码是在其
原码的基础上, 符号位不变, 其余各位取反, 最后+1
。 (即在反码的基础上+1)
举个栗子:
那么计算机为什么要使用补码呢?
首先,根据运算法则减去一个正数等于加上一个负数, 即: 1-1 = 1+(-1), 所以计算机被设计成
只有加法而没有减法
, 而让计算机辨别”符号位”会让计算机的基础电路设计变得十分复杂,于是
就让符号位也参与运算,从而产生了反码
。
用反码计算, 出现了”0”这个特殊的数值, 0带符号是没有任何意义的。 而且会有[0000 0000]和[1000 0000]两个编码表示0。于是设计了
补码
, 负数的补码就是反码+1,正数的补码就是正数本身,从而解决了0的符号以及两个编码的问题: 用[0000 0000]表示0,用[1000 0000]表示-128。
注意
-128实际上是使用以前的-0的补码来表示的,
所以-128并没有原码和反码
。使用补码, 不仅仅修复了0的符号以及存在两个编码的问题,
而且还能够多表示一个最低数
。 这就是为什么8位二进制(byte), 使用补码表示的范围为[-128, 127]
其他的数据类型也是类似,就不再赘述。
1.jpg
(54.65 KB, 下载次数: 6)
下载附件
2018-10-8 22:23 上传
2.jpg
(57.49 KB, 下载次数: 10)
下载附件
2018-10-8 23:25 上传
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2