黑马程序员技术交流社区

标题: 班主任交代,一定要写两篇帖子之其一 [打印本页]

作者: 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表示负。([0000 0000]~[1111 1111],标记成红色的那一位决定了这个数的正负号),所以byte的最大值用二进制表示应该是[0111 1111],换算成十进制就是127。那么最小值是啥呢?是[1111 1111]还是[1000 000]呢?前者,最高位是1,代表负数,剩下的部分转换成 十进制是127,最终结果是-127。这和我们学到的结论不一致呀!-128是怎么 来的啊?啊哈哈,一个冲击性的事实,[1000 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)

1.jpg

2.jpg (57.49 KB, 下载次数: 10)

2.jpg





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2