补码

1)正数的补码  

 

与原码相同。

  【例1】+9的补码是00001001。

(2)负数的补码

  符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。

  【例2】求-7的补码。

  因为给定数是负数,则符号位为“1”。

  后七位:+7的原码(0000111)→按位取反(1111000)→加1(1111001)

  所以-7的补码是11111001。

  已知一个数的补码,求原码的操作分两种情况:

  (1)如果补码的符号位为“0”,表示是一个正数,其原码就是补码。

  (2)如果补码的符号位为“1”,表示是一个负数,那么求给定的这个补码的补码就是要求的原码。

  另一种方法求负数的补码如下:

  例如:求-15的补码

  第一步:+15:00001111

  第二步:逐位取反(1变成0,0变成1),然后在末尾加1。

  11110001

  再举一个例子验证下:求-64的补码

  +64:01000000

  11000000

  【例3】已知一个补码为11111001,则原码是10000111(-7)。

  因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”。

  其余七位1111001取反后为0000110;

  再加1,所以是10000111。

(3).补码的绝对值(称为真值)

  【例4】-65的补码是10111111

  若直接将10111111转换成十进制,发现结果并不是-65,而是191。

  事实上,在计算机内,如果是一个二进制数,其最左边的位是1,则我们可以判定它为负数,并且是用补码表示。

  若要得到一个负二进制数的绝对值(称为真值),只要各位(包括符号位)取反,再加1,就得到真值。

  如:二进制值:10111111(-65的补码)

  各位取反:01000000

  加1:01000001(+65的补码)

 

 unsigned char a = 0x7f; 
 char b  = a+1;  //b  0x80

 printf("%d %u /r/n", b ,a); // -128 127

 

 char a = 0xee;
 char b = 0xee;
 char c = a+b;  // 0xde 

 

 //1101 1100 各位取反-> 0010 0011 再加1-> 0010 0100 -> 36

 

 printf("%d %u /r/n", c ,c); 

 

//-36  4294967260 即 FFFFFFDC 实际将unsigned char转为unsigned int型,符号扩展,由于是负数,前面全部填充1

 

 

 

 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值