C语言-原码 反码 补码

首先这里我们先使用 ~ 位取反 来带入正题

int main()
{
	int a = 0;
	printf("%d",~a);
}

结果: -1

大家应该就比较好奇了 为什么是-1呢
位取反也就是 二进制位取反 首先会先把 0 转换成2进制 然后取反 就得到下面的结果
00000000 00000000 00000000 00000000
11111111 11111111 11111111 11111111
但是这也不等于-1呀 这里就要说到 整数在内存中存储的都是补码 正数的原码 补码 反码 都是一样的(规定)

那么我们把-1 转换成 二进制 来看一下 他的原码是多少 (原码就是直接转成二进制后的值)
10000000 00000000 00000000 00000001(原码)第一个1代表的是负值
11111111 11111111 11111111 11111110 (反码)就是相反的值 但是注意符号位不变 就是第一位
11111111 11111111 11111111 11111111(补码)正数的补码就是其本身 负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)

所以前面取得 0的位取反 得到的11111111 11111111 11111111 11111111 存储到内存中 就是一个补码
当我们输出的时候 就会转换成原码的方式 进行输出 10000000 00000000 00000000 00000001 也就是 -1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值