我是靠谱客的博主 醉熏烤鸡,最近开发中收集的这篇文章主要介绍原码,反码,补码的简单理解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

今天开始看阿里的<<码出高效:Java开发手册>>,头一章便是计算机基础。计算机的基础世界一切都是由0和1组成。

既然是0和1的世界,肯定就逃不了原码,反码跟补码的使用。
首先我们直到一个byte代表一个字节,有8位。

如果用byte即8位存储一个数字的话那范围是多少?

答案是:-128~127.

扩展一下:

Integer i1 = 100;
Integer i2 = 100;

Integer i3 = 200;
Integer i4 = 200;
System.err.println(i1 == i2);
System.err.println(i3 == i4);

第一个会打印true,第二个会打印false。
这是什么原因呢,原来在JDK1.5中对整形数据采用了缓存,缓存-128 ~ 127范围的数据。

回到正题:

为啥会有原码,反码,补码的概念呢?
因为加减法是高频运算,使用同一个运算器,,可以减少中间变量存储的开销也降低了CPU内部的设计复杂度,所以我们将减法转换成加法运算,比如1-2转换为1+(-2).

而原码,反码,补码的存在就是为了解决其中的问题。
关于原码,反码,补码的介绍与应用,网上已经有了很多优秀的详解,我这里就不多累赘了,直接贴网址了,就这么直接(好吧,我懒)
https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html

总结:

  1. 要区分正数和负数:最左边的是符号位,0代表正数,1代表负数
  2. 正数的反码和补码都与原码相同。
  3. 负数的反码为对该数的原码除符号位外各位取反。
  4. 负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1

注意:如果没有补码,只有反码的话,0的表示有两个:0000 0000和-0000 0000
所以出现了补码:

(-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]补 + [1000 0001]补 = [1000 0000]补

所以对应一开始的问题如果用8位存储01的话 范围是-128~127,
其中0000 0000代表0,-0000 0000代表-128

如果直到一个负数的补码,如何直到原负数值呢?
如负数的补码为11111110
则最左位表示负数,右7位值取反加1得到的是负数的绝对值:-(0000001+1)=-2;

题外话:
小心结果溢出,如果计算结果需要9位保存,而我们只有8位,这个时候就出现结果溢出的问题,即在数据运算的过程中,超出规定的表示范围。一旦溢出,计算结果就是错误的,所以在各个编程语言中规定了不同数字类型的表示范围,有相应的最大值和最小值。

最后

以上就是醉熏烤鸡为你收集整理的原码,反码,补码的简单理解的全部内容,希望文章能够帮你解决原码,反码,补码的简单理解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部