原码反码补码

原码:  -16  =  10010000    1表示符号位(1负0正)

反码:  -16  =  11101111   

补码:  -16  =  11110000

 

原码:   9  =  00001001    1表示符号位(1负0正)

反码:   9  =  00001001  

补码:   9  =  00001001

 

-16 + 9

11110000

+  00001001

   11111001(补码)

 

11111001的反码 10000110

11111001的原码 10000111 = -7

 

-7  原码  100000111

-7  反码  111111000

-7  补码  111111001

 

补码减1得到反码,反码取反得到原码

-----------------------------------------------------------------

#include<stdlib.h>
#include<stdio.h>
int main(int argc, char* argv[])
{
 short a, b, c;
 a = 32767;
 b = a + 1;
 c = b + 1;
 printf("%d\n", sizeof(a));
 printf("a = %d, b = %d, c = %d", a, b, c);
 getchar();
 return EXIT_SUCCESS;
}

运行结果:

因为a = 32767,正数的原码反码补码都是一样,内存中数据用补码表示,所以a在内存中表示为0111 1111 1111 1111

1在内存中的表示为0000 0000 0000 0001

于是a + 1 对补码进行与运算得到

     0111 1111 1111 1111

     0000 0000 0000 0001

---------------------------------------

     1000 0000 0000 0000

 而1000 0000 0000 0000最高位是1表示负数,又因为其是补码,补码减1取反得到:

     1000 0000 0000 0000

     0000 0000 0000 0001

------------------

     1111 1111 1111 1111

对1111 1111 1111 1111 取反得到

   1000 0000 0000 0000 值为-32768

因为-32768 在内存中的补码为: 1000 0000 0000 0000

当-32768 + 1 表示为:

   1000 0000 0000 0000

   0000 0000 0000 0001

-------------------------------------------------

  1000 0000 0000 0001

1000 0000 0000 0001为补码,对其减1取反:

   1000 0000 0000 0001

   0000 0000 0000 0001

-----------------------------------

   1000 0000 0000 0000

对1000 0000 0000 0000取反得到:

   1111 1111 1111 1111表示数值-32767

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值