原码,反码 ,补码

定义

-11
原码1000 00010000 0001
反码1111 1110

0000 0001

补码1111 11110000 0001

可以看出,正数的原码、反码、补码是一样的;负数的反码除了最高位,其余位按位取反,补码在反码基础上加1。

原码是给人看的,比较直观;反码是为补码而存在;补码是这个数真实存储在计算机的样子。

为什么计算机要搞补码呢?

例1,补码可以解决溢出的问题

如果计算机用原码存储,-1+1=1000 0010,就无法得到正确值。而用补码,就等于0000 0000,进位就不管了,因为是unsigned char只有8个位宽。再通过char去解析,就得到正确的值了。

例2,补码可以计算两数之差

如果要计算1-16,计算机里是0000 0001-0001 0000=1111 0001(借位忽略掉),注意结果1111 0001是补码,这个补码代表什么数,就要看你怎么解析了

如果解析为char,那他就是1111 0001-->1111 0000-->1000 1111-->-15,刚好1 - 16 = -15;

如果解析为unsigned char,那他就是1111 0001-->0xf1-->15*16+1=241,代表从0001 0000到1111 1111,再加1,共241。

#include <stdio.h>

typedef unsigned char  uint8_t;
typedef unsigned int  uint32_t;
typedef unsigned long int  uint64_t;


int main() {
	printf("%d\n",(uint8_t)(0x1-0x10));

	return 0;
}

补码可以计算两数之差有什么好处呢,比如你有一个32位的计数器,假如这个计数器计到0xFFFF FFF0时,你要开始计时了,计数器很快就会溢出,假如溢出后变为0x0000 0005,这个时候只需要(unsigned int)(0x0000 0005-0xFFFF FFF0),就能计算出经过了多少时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值