求负数补码的3种⽅法,为什么引⽤补码,⽤c语⾔实现
求的⽅法
正数没有争议就是等于补码和反码
为什么引⼊补码
数的原码表⽰百形式简单,适⽤于乘除运算,但⽤原码表⽰的数进⾏加减度法运算⽐较复杂,引知⼊补码之后,减法运算可以⽤加法来实现,且数的符号道位也可以当作数值⼀内样参与运算,因此在计算机中⼤都采⽤补码来进⾏加容减法运算 如:2 - 1 = 2 + (-1) 这样统⼀成加法,计算机底层设计可以只⽤加法运算器就可以实现+,-运算,设计越简单就可以加快处理得速度
引⾃:百度百科
补码“模”概念的引⼊、负数补码的实质、以及补码和真值之间的关系所揭⽰的补码符号位所具有的数学特征,⽆不体现了补码在计算机中表⽰数值型数据的优势,和原码、反码等相⽐可表现在如下⽅⾯ [3] :
(1)解决了符号的表⽰的问题 [3] ;
(2)可以将减法运算转化为补码的加法运算来实现,克服了原码加减法运算繁杂的弊端,可有效简化运算器的设计 [3] ;
(3)在计算机中,利⽤电⼦器件的特点实现补码和真值、原码之间的相互转换,⾮常容易 [3] ;
(4)补码表⽰统⼀了符号位和数值位,使得符号位可以和数值位⼀起直接参与运算,这也为后⾯设计乘法器除法器等运算器件提供了极⼤的⽅便。总之,补码概念的引⼊和当时运算器设计的背景不⽆关系,从设计者⾓度,既要考虑表⽰的数的类型(⼩数、整数、实数和复数)、数值范围和精确度,⼜要考虑数据存储和处理所需要的硬件代价。因此,使⽤补码来表⽰机器数并得到⼴泛的应⽤,也就不难理解了。 [3]
求负数反码的两种⽅法
⽅法1:课本
负数的补码是在原码的基础上除符号位外其余位取反后+1
如,已知:-9 补码是:1000 1001
下⾯求-9 补码:1000 1001 除符号位取反
下⾯求-9 补码:1111 0110 取反后加1
下⾯求-9 补码:1111 0111
⽅法2:利⽤相反数减法求补码
“正数的补码,是其本⾝。 负数的补码,就⽤它的正数,减⼀取反,即可得到补码。
-9 相反数9:0000 1001
先减⼀:0000 1001 - 1 = 0000 1000;
再取反:1111 0111。
所以有:-9 补码 = 1111 0111。
⽅法3:简化过程求补码
1. 求出负数绝对值的原码
2. 从原码的最后⼀位数码位往前数,当遇到第⼀个1时停在此位置
3. 将第⼀个1前⾯的数码全部求反
下⾯求-9 补码:
到右边的第⼀个1:0000 1001 发现在最后⼀位
除了右边的第⼀个1:1111 0111 全部取反(包括符号位置)
所以有:-9 补码 = 1111 0111。
⽅法三:c语⾔代码
以下代码求了-128 ~ -1的所有补码
memset 函数的使⽤
/*负数补码还原成原码是这样的:1. 从补码的最后⼀位数码位往前数,遇到第⼀个1时停⽌2. 将第⼀个1前的全部数码取反3. 将第⼀个数码置1(原来肯定是0,因为我们这⾥只讨论负数的补码)下⾯求-9 补码:先减⼀:0000 1001 - 1 = 0000 1000;  1. 到右边第⼀个1 再取反:1111 0111。      2. 1左边的数全部取反,右边的1因为减去了1变成0,取反后还是1,相当于不变 所以有:-9 补码 = 1111 0111。  3. 得到负数的补码 */ #include <stdio.h>#include <memory.h>#include <string.h>#include <stdlib.h>int  arr [8];    //范围为 -128 ~ +127void  Complement (int  number )    //求负数补码{ int  number_0 = number ;
  //记录当前负数    number =abs (number );    //取绝对值    int  i =7;    while (number !=0) //求出其绝对值原码    {        arr [i ]=number %2;//        printf("arr[%d]=%d\n",i,arr[i]);        i --;//        printf("number=%d\n",number);        number /=2;            }    for (i =7;i >=0;i --)    {        if (arr [i ]==1)        {            int  j ;            for (j =0;j <i ;j ++)    //从右往左数,第⼀个1左边的数取反                if (arr [j ]==1)                    arr [j ]=0;                    else                    arr [j ]=1;            break ;        }    }    printf ("%d\t=\t",number_0);    for (i =0;i <=7;i ++)        printf ("%d",arr [i ]);        printf ("\n");    memset (arr ,0,sizeof (arr ));    //重置数组各项为0 }int  main (){    int  i ;    for (i =-128;i <=-1;i ++)    // 求 -128 ~ -1 的补码        Complement (i );        return  0;}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
负75的补码怎么求
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/*void *memset(void *str, int c, size_t n)参数str -- 指向要填充的内存块。c -- 要被设置的值。该值以 int 形式传递,但是函数在填充内存块时是使⽤该值的⽆符号字符形式。n -- 要被设置为该值的字节数。*/ #include  <stdio.h>#include  <string.h>int  main (){  char  str [50];  strcpy (str ,"This is string.h library function");  puts (str );//This is string.h library function    memset (str ,'0',7);  puts (str );//0000000 string.h library function      return (0);}12345678910111213141516171819202122

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。