【无标题】源码、反码、补码

一 . 源码、反码、补码

源码:整形的源码是4个字节,即32个比特位

源码的第一个数是符号位,0表示为正数,1是为负数

如:a = 10

       00000000000000000000000000001010    -  源码

                                                           2^3 + 2^1 =10

       00000000000000000000000000001010   -  反码

       00000000000000000000000000001010   -  补码

正整数的源码、补码、反码是一样的

b = -10

       10000000000000000000000000001010   -  源码

       111111111111111111111111111111110101   -  反码 (符号位不变,其余位都与源码相反)

       111111111111111111111111111111110110   -  补码  (符号位不变,反码+1)

补码->源码

1.  减1取反

       111111111111111111111111111111110110    -  补码

       111111111111111111111111111111110101   -  减1

       10000000000000000000000000001010   -  源码(取反)

2.  取反加1

       111111111111111111111111111111110110   -  补码

       10000000000000000000000000001001   -  取反

       10000000000000000000000000001010   -  源码(加1)

二 . 运算

#include <stdio.h>
int main()
{
   int a = 1;
   int b = -1;
   printf("%d\n",a+b);
   return 0;
}

计算机用补码计算

//  10000000000000000000000000000001   ——  -1的源码

//  11111111111111111111111111111110           ——  -1的反码

//  11111111111111111111111111111111           ——  -1的补码

//  00000000000000000000000000000001  ——  1的补码

//  00000000000000000000000000000000 ->0(a+b)

源码的计算是错误的

 // 10000000000000000000000000000001   ——  -1的源码

//  00000000000000000000000000000001    ——  1的源码

//  10000000000000000000000000000010    ->  -2

截断、整形提升:有符号数提升时,按符号位提升;无符号数提升时,前面全部补0

#include <stdio.h>
int main()
{
  char a = -1; //补码截断,取后8位
// 10000000000000000000000000000001  -  -1源码
// 11111111111111111111111111111110  -  -1反码
// 11111111111111111111111111111111  -  -1补码
// 11111111  - a

  signed char b = -1;
// 11111111111111111111111111111111  -  -1补码
// 11111111  - b

  unsigned char c = -1;
// 11111111111111111111111111111111  -  -1补码
// 11111111  - c

  printf("a=%d b=%d c=%d\n",a,b,c);
//要打印出整形,所以要整形提升
// a,b相同
// 11111111111111111111111111111111  -  补码(有符号数提升时,按符号位提升)
// 11111111111111111111111111111110  -  反码
// 10000000000000000000000000000001  -  源码

//无符号数提升时,前面全部补0
// 11111111  - c
// 00000000000000000000000011111111  -  补码,也是源码
  return 0;
}

#include <stdio.h>
int main()
{
   int i = -20;
// 10000000000000000000000000010100  -源码
// 11111111111111111111111111101011  -反码
// 11111111111111111111111111101100  -补码    
                        
   unsigned char j = 10;
// 00000000000000000000000000001010  -源码(补码)

   printf("%d\n",i+j); //-10

// 11111111111111111111111111101100  -补码
// 00000000000000000000000000001010  -补码

// 11111111111111111111111111110110  -补码
// 10000000000000000000000000001001  -反码
// 10000000000000000000000000001010  -源码
   return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值