原码,反码和补码
来源:互联网 发布:linux 打开防火墙端口 编辑:程序博客网 时间:2024/06/04 18:34
参考了网上的一些资料,忘了地址了
原码,反码,补码
一.机器数和真值
1.机器数
一个数在计算机中的二进制表示叫做机器数。机器数是带符号的,最高位表示符号,0是正,1是负。
例如十进制的2转换成二进制是00000010,如果是-2,就是10000010.
这里的00000010和10000010就是机器数。
2.真值
因为第一位是符号位,所以正常转换得出的值句不是真正的数值。例如-2的表示10000010的十进制表示130,但是由于第一位是符号位,相当于-0000010,所以它真正的值是-3.
二.原码反码补码的定义和计算方法
1.原码
原码就是符号位加上真值的绝对值,第一位表示符号位,其余位标示值。
例如:
10000001的值为-1, 00000001的值为1
原码是很容易理解的。
2.反码
反码的表示方法是:
正数的反码是其本身,负数的反码是符号位不变其余各位取反
例如:00000001的反码是00000001
10000001的反码是11111110
反码看起来就太直观了,我们需要通过计算才能知道到底真值是多少。
3.补码
补码的表示方法:
正数的补码是其本身,负数的补码是符号位不变,其余各位取反加1
例如:00000001的补码是00000001
10000001的补码是11111111
三.为何要使用原码,反码和补码
可以看出,原码是非常容易辨识的,既然如此,又为何要提出反码和补码呢?
首先为了使得硬件电路设计简单,我们只设计了加法,因为如果要来辨别符号位,硬件电路的设计将会变得复杂。于是就让符合位也参与到计算中去。
首先假如用原码来表示,可以看一下计算的结果:
1+(-1)= 00000001+10000001 = 10000010 = -2,结果显然不对。
如果使用反码来计算:
1+(-1) = 00000001 + 11111110 = 11111111 = (原码)10000000 = -0
这个也是有问题,-0会让我们很困惑。
使用补码就可以解决这一问题:
1+(-1)=00000001+11111111=00000000=0,这个就是正确的值了
另外还有一点,原码,反码因为最高位是字符位,所以可以表示的范围是-127到127
但是使用补码却可以多表示一位,
(-1)+(-127) = -128 = 11111111+10000001 = 10000000
这里实际使用以前-0的值来表示-128,所以-128并没有原码和反码表示。
因为机器使用补码,所以32位int的范围是 [-231, 231-1] ,因为第一位用作符号位,而使用补码表示又可以多存储一位。
- 原码、反码和补码
- 原码、补码和反码
- 原码、补码和反码
- 原码、反码和补码
- 原码、反码和补码
- 原码、反码和补码
- 原码、反码和补码
- 原码、反码和补码
- 原码、补码和反码
- 原码、补码和反码
- 原码、反码和补码
- 原码、反码和补码
- 原码、补码和反码
- 原码、补码和反码
- 原码、补码和反码
- 原码、反码和补码
- 原码、补码和反码
- 原码、反码和补码
- 物理层
- 每分钟的SYSSTAT汇总统计
- l另外一种侧滑菜单MenuDrawerDemo
- Java IO最详解
- [LeetCode] Distinct Subsequences
- 原码,反码和补码
- poj 1159 Palindrome
- Android中SoundPool和MediaPlayer的区别
- 鸟哥的linux服务器架设篇学习笔记——CentOS相关网络设定
- SGU 199 Beautiful People
- Elasticsearch搜索类型(query type)详解
- Gas Station
- 初学Android,音频管理器之控制音频(六十六)
- 黑马程序员——Java泛型知识点