补码的计算

对于程序猿或者是其它搞计算机类的人员,这篇只是为了解释一下原码,反码,补码之间的计算和解释上一篇的a + ~a = -1的问题!!!


  1. 首先先介绍一下整数在计算机中表示方法,数在计算机中都是用二进制表示,但是字节长度就不一定了,不同的机器可能就不一样
  2. 而且在计算机系统中,补码是最重要的编码,数值一律用补码来表示和存储
  3. 移码(又叫增码)是符号位取反的补码,一般用做浮点数的阶码,引入的目的是为了保证浮点数的机器零为全0
  4. 整数有正,有负的,所以计算机中为了表示正负,用字节的最高位来表示正负,其它位表示数值
  5. 例如大多数计算机体系中,(signed) int 就是一个有符号的数,占4个字节,signed可以不写,默认int就是signed int,另外signed默认也是signed int,不过这样写不规范,不建议这么写,
  6. 为了方便演示,下面就以一个字节为例!

  1. 正数的最高位是0,负数的最高位是1
  2. 正数原码和反码,补码都是一样的,都是正数本身
  3. 对于负数
  1. 原码是符号位为1,其它位和数本身的正数一样,也就是负数的原码等于其相反数的原码,但是最高位为1即可
  2. 反码就是在负数的原码基础上,符号位不变,其余的按位取反
  3. 补码就是在负数的反码基础上,符号位不变,加上1即可

4. 从十进制求它二进制的原码,反码,补码就按上面的方法,但是知道一个补码怎么求数本身呢,对于正数不用求,因为就等于其本身(看符号位是否为0),但是对于符号位为1的补码,那就要再求一次补码了,过程是一样的,符号位不变,按位取反,最后加上1即可!然后算出其10进制的数的值再加上负号即可。下面举例子来说明一下!!!



eg:

7(10)-->0000 0111(2)  最高位0表示符号位,0表示正数

原码=反码=补码=0000 0111

-7(10)

原码:1000 0111(2)  最高位1表示为负数

反码:1111 1000(2)  在原码基础上符号位不变,其它的按位取反

补码:1111 1001(2)  在反码基础上符号位不变,再加上1

note:对于已经比较熟悉这些转换的人来说,就是~|-7|+1 即可!这个不作解释

已知补码求数本身---->1111 1011(2)-->?

note:方法就是再求一次其补码即可

1111 1011-->1000 0100 符号位不变,其它的按位取反

1000 0100-->1000 0101 符号位不变,再加上1 -->  -5(10)

好了现在可以回答上一篇《嵌入式c语言中的位运算》的问题了,假如是一个正数a的~a那么就是其它相反数的补码,但是没有加上1,所以比相反数少1(~a ==-a-1),所以和相反数-1相加就于-1,例如: a = 5, ~a + a =a+(-a -1) = -1 了!现在假如是一个负数,a = -5  1111 1011[补码](计算机中用补码表示整数) 把补码按位取反之后(包括符号位)为 0000 0100 正常情况下是符号位不变而且还要加上1的,但是这里没有加上1和保持符号位不变,所以就变成数本身的相反数-1了,也就是~a == -a-1,所以a+~a = a+(-a-1) = -1 

下面用程序来证明吧!

 1 #include <stdio.h>
  2 int main()
  3 {
  4         int a = 5;
  5         int b = ~a;
  6         int ret = a+b;
  7         printf("%d + %d = %d \n",a,b,ret);
  8 
  9         a = -22;
 10         b = ~a;
 11         ret = a + b;
 12         printf("%d + %d = %d \n",a,b,ret);
 13 }

时间: 2024-10-12 03:49:26

补码的计算的相关文章

java基础:原码反码补码

计算机在操作的时候,都是采用数据对应二进制的补码来计算的: 原码 反码 补码 原码:用原码,反码,补码来分别表示+7,和-7. 首先得到7的二进制:111

c语言学习笔记分享——原码、反码与补码

一.什么是原码.反码和补码我们知道,在计算机内部存储的带符号数都是以补码形式存储,用补码形式进行运算的.什么是一个数的补码?为什么要用补码?这要从数的原码.反码开始讲.我们以整型数为例,且假定字长为8位.1.原码整数X的原码是指:其符号位为0表示正,为1表示负;其数值部分就是X的绝对值的二进制数.X的原码通常用[X]原表示.如:[+100]原=01100100 [+0]原=00000000[-100]原=11100100 [-0]原=10000000注意:在原码中,零有两种表示形式.原码表示法简

原码,反码,补码,移位

复习下二进制的有关知识 1.所有的数据都是以二进制的形式存储在硬盘上.对于一个字节的8位到底是什么类型 计算机是如何分辨的呢? 其实计算机并不负责判断数据类型,数据类型是程序告诉计算机该如何解释内存块. 2.对于字符的存储,先将字符转化成其字符集的码点,(码点就是一个数字),然后把该数字转成2进制存储.所以我们只要记得数字的存储就ok了.字符的码点程序采用无符号处理,即没有符号位,数值型默认都是有符号位的. 1个字节的最高位是符号位所以一个数字能够存储的范围是-128-127 3.原码 正数5:

补码理解

关于补码的理解 1.理解周期: 以时间为例,12小时制,13点就代表了1点.对于处于3点的位置如何移动到8点? 1.顺时针移动5个点位.3 + 5 = 8 2.逆时针移动7个点位.3  - 7 = 8 2.加法减法: 在一个周期计数体制里进行减法可以归并为加法,以上述例子为准:3-7=3+5 推导过程:3-7 = 3-7 + 12 = 3 + (12-7) = 3+5 所以在进行减法计算时被减数可以存储为:(周期数-被减数) 3.关于补码: 为什么要以补码存储负数,如何让符号位参与运算? 计算机

二进制正负数的原码、反码、补码之间的转化

首先,计算机都是使用二进制的补码进行计算. 1.正数的二进制原码.反码.补码都是相同的 2.负数的二进制原码:先计算该负数绝对值的二进制.之后对其每个数"取反",然后加一. 比如-32 第一步:32(10)=00100000(2) 第二步:求反:11011111 第三步:加1:11100000 3.负数的反码:等于原码的最高位不变,其余取反. 比如-32 原码为:11100000 反码为:10011111 4.负数的补码:等于原码的最高位不变,其余取反,然后加一. 比如-32 第一步,

补码的数学原理

计算机是用n位0和1来表示数字的,这样很容易表示正数,但是怎么表示负数呢? 人类聪明的大脑想到了用第一位来表示符号,0代表正数,1代表负数.这种表示方法最好理解,叫做原码. 但是计算机在计算的时候,为了简化,需要把减法当做加法运算.这个很简单,负数不就是干这个的吗?比如2-1=2+(-1). 但是负数如果按照原码表示的话,就不好办了,比如: 2-1=2+(-1)=00000010+10000001=10000011=-3 显然是错的,所以人类习惯的方法无法满足这个需求,根本原因在于符号位的引入不

为什么要使用原码、反码、补码和移码

上篇博客简单的介绍了计算机中原码.反码.补码和移码的表示方式(http://blog.csdn.net/xdd19910505/article/details/40424533),对于计算机为什么要这样还不是很明白,就好像知道这样一个东西,却不知道为什么要这样.就好像一个人你不了解他不是他的朋友,他的有些事情你就不知道他是为了什么-- 其实从原码到补码是一个层层递进的关系,也是一个在错误中逐步发展的过程.也就是说利用原码运算减法时出现的错误,为了解决出现了反码运算,但是反码运算时又出现了让人不满

软考——再看原码、反码、补码

众所周知,一个正数的原码.补码.反码是相同的,负数则不同.先提一个问题,为什么在计算机中要使用这些编码方式呢? 1. 原码 将最高位用做符号位(0表示正数,1表示负数),其余各位代表数值本身的绝对值的表示形式.这种方式是最容易理解的. 例如,+1的原码是00000001,-1的原码是10000001. 但是直接使用原码在计算时却会有麻烦,比如(1)10+(-1)10=0,如果直接使用原码则: (00000001)2+(10000001)2=(1000010)2 这样计算的结果是-2,也就是说,使

原码 补码 反码

一.原码 正数的原码就是它的本身 假设使用一个字节存储整数,整数10的原码是:0000 1010 负数用最高位是1表示负数 假设使用一个字节存储整数,整数-10的原码是:1000 1010 二.反码 正数的反码跟原码一样 假设使用一个字节存储整数,整数10的反码是:0000 1010 负数的反码是负数的原码按位取反(0变1,1变0),符号位不变 假设使用一个字节存储整数,整数-10的反码是:1111 0101 三.补码(再次强调,整数的补码才是在计算机中的存储形式.) 正数的补码和原码一样 假设