基础03:原码、反码、补码
机器数,即数字在计算机中的二进制表示形式。
真值,第一位用+-表示数字的正负,其余为二进制数。
举个栗子:-3的机器数是10000011,真值是-0000011。
原码,符号位加真值的绝对值。
1
2
+3[原] = 00000011
-3[原] = 10000011
8位二进制数原码的取值范围是[11111111, 01111111],即[-127, 127]
反码正数的反码是其原码。
负数的反码,符号位不变,其余各位取反,即1变成0,0变成1。
1
2
+3[反] = 00000011[原] = 00000011[反]
-3[反] = 10000011[原] = 11111100[反]
8位二进制数反码的取值范围是[11111111, 01111111],即[-127, 127]
补码正数的的补码是其原码。
负数的补码,是其反码+1。
1
2
+3[补] = 00000011[原] = 00000011[反] = 00000011[补]
-3[反] = 10000011[原] = 11111100[反] = 11111101[补]
反码和补码均不能直接看出其实际的数值,需要转换成原码后再计算。
为何要使用补码原码比较直观,它的数值部分就是该数的绝对值,而且与真值、十进制数的转换十分方便。但是它的加减法运算较复杂。当两数相加时,机器要首先判断两数的符号是否相同,如果相同则两数相加,若符号不同,则两数相减。在做减法前,还要判断两数绝对值的大小,然后用大数减去小数,最后再确定差的符号。换言之,用这样一种直接的形式进行加运算时,负数的符号位不能与其数值部分一同参加运算,而必须利用单独的线路确定和的符号位。要实现这些操作,电路就很复杂。
为了减少设备,解决机器内负数的符号位参加运算的问题,总是将减法运算变成加法运算,引进了反码机器数,可以让符号位直接参与计算,把它统一看做无符号数。
1
-3 + 2 = 11111100[反] + 00000010[反] = 11111110[反] =10000001[原] = -1
看似挺好,但也会出问题。
1
3 - 2 = 3 + (-2) = 00000011[反] + 11111101[反] = 00000000[反] = 00000000[原] = 0
显然是不对的。
反码可以让符号位直接参与运算,但计算结果有错误。
并且,11111111[反] = 10000000[原] = -0 00000000[反]=00000000[原] = +0
自然数中, -0 = +0 = 0,但是0却又两个表示。
所以,反码充满了错误。
为了解决反码的错误,引入了补码。
1
2
3
-3 + 2 = 11111101[补] + 00000010[补] = 11111111[补] = 11111110[反] = 10000001[原] = -1
3 + (-2) = 00000011[补] + 11111110[补] = 00000001[补] = 00000001[原] = 1
1 + (-1) = 00000001[补] + 111111111[补] = 00000000[补] = 00000000[原] = 0
即,0 可以用00000000[补]表示,-0不存在。用10000000[补]表示-128。
1
(-1) + (-127) = 11111111[补] + 10000001[补] = 10000000[补] = -128
注:-1 + -127的结果是-128,所以用补码最后计算的结果10000000[补]来表示-128,但-128并不存在反码和原码。若按照反码和原码计算,10000000[补] = 01111111[反] = 00000000[原] = 0显然是不正确的。
使用了补码,可以再[-127, 127]的范围内,在表示-128,即可以表示的范围是[-128, 127]。
所以,n位二进制数,可表示的整数范围是[-2^n-1, (2^n-1) - 1]。上述的栗子n=8,即一个字节。
正数取模,易于理解。
1
5 mod 3 = 2
负数取模,要理解取模运算的数学定义。
1
x mod y = x - y * floor(x/y)
其中floor(x)称为向下取整函数,表示不超过x的最大整数。
举个栗子:
1
-5 mod 3 = -5 - 3 * floor(-5 / 3) = -5 - 3 * floor(-1.6666...)= -5 - 3 * (-2) = 1
所以-5 mod 3 = 1
同余若x mod z = y mod z,那么称x, y关于z同余,记为 x ≡ y (mod z)。
同余有很多定理,与本文没有关系,有兴趣的童鞋自己去证明或查资料。
先说结论:补码对应的无符号整数与真值是关于256(=28)同余。
正数和0的补码对应的无符号整数等于其真值,所以也同余。
关于负数,举个栗子。
-3 = 11111101[补] 而11111101作为无符号二进制的值是253。
-3 mod 256 = -3 - 256 * floor(-3/256) = -3 - 256 * (-1) = 253
253 mod 256 = 253
所以 -3 ≡ 253 (mod 256)。
进一步的结论,在8位机中,计算机的循环计数周期为256,符号位参与运算,即将其当做无符号数进行运算后的结果,实际是把真值对256取模。在原码、反码、补码中,只有补码对应的无符号数与真值是关于256同余的,所以用补码的形式表示数字是符合数学原理的。
~~ EOF ~~
jeremy_wong 本博客全部转自我的个人博客,http://higoge.github.io,上面的文章更全。 联系我请发邮件到higoge@gmail.com或微博 @挨踢汪汪
相关文章
- SpringMVC基础-03
- Spring基础-03
- onenet基础通信套件加B300移植
- Win10系列:UWP界面布局基础1
- android基础知识点复习之短信发送
- Git基础03
- SQL Server调优系列基础篇(并行运算总结篇二)
- 第03篇:C#星夜拾遗之语法基础
- android 动画基础绘——帧动画(三)
- C/C++基础讲解(四十九)之图形篇(绘制正多边形/正六边形螺旋图案)
- 03基础自绘-18手机通讯录-telwidget
- 03基础自绘-15农历信息-lunarcalendarinfo
- 03基础自绘-14滑动日期-tumblerdatetime
- 03基础自绘-13滑动选择-tumbler
- 03基础自绘-11开关按钮-switchbutton
- 03基础自绘-09多彩旋转-roundwidget
- 03基础自绘-07游动的鱼-magicpoolfish
- CSS 基础点集锦一:盒子模型、浮动、清除浮动
- PHP 零基础入门笔记(9):函数 function
- y131.第七章 服务网格与治理-Istio从入门到精通 -- Istio Security基础(十七)
- TensorFlowX.Y核心基础与AI模型设计03:AI模型编程常用(二)
- python基础===pendulum '''Python datetimes made easy.'''
- HTML基础
- 数学基础从高一开始3、集合的基本运算
- 零基础可以转行做数据分析吗?
- 编程入门先学什么?零基础转行编程难不难?
- Linux云计算-03_必备基础命令
- OpenCV(C++)图像处理基础03:读写像素、像素值修改、像素反差