栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

原码,反码,补码,以及按位取反怎么算

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

原码,反码,补码,以及按位取反怎么算

首先要清楚:
1.一个数在电脑内存中是以 补码 的形式存在,知道这一点很重要
2.0、正数的原码、反码、补码不变,负数的原码、反码、补码有所不同
如-1(类型按照整型,即有32位):
原码:10000000 00000000 00000000 00000001
反码:1 1111111 11111111 11111111 11111110
补码:1 1111111 11111111 11111111 11111111
即:
反码:原码的符号位不变,其他位 按位取反
补码:在反码的基础上+1
0(类型按整型解释):
原码:00000000 00000000 00000000 00000000
反码:00000000 00000000 00000000 00000000
补码:00000000 00000000 00000000 00000000
原码、反码、补码均一样

大致意思解释完了,下面说一下按位取反( ~ )怎么算。

这里举一个例子,方便更好解释

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

最后得出的结果却是-1,出现这种情况的原因就是因为数在内存中是以补码形式存在的。

这里的i是整型,则有32位
0在内存中的存在形式: 00000000 00000000 00000000 00000000
~0在内存中的存在形式( ~ 是对0在内存中的存在形式进行取反的,且直接以取反后的序列存在内存中):11111111 11111111 11111111 11111111,这一串代表的是补码,要想得出结果需要翻译成原码,先翻译成反码(这里首位是1,为负数,在补码上-1就是反码):1 1111111 11111111 11111111 11111110,再找原码(符号位不变,其他位 按位取反):10000000 00000000 00000000 00000001,即结果为-1

在举个例子:

int main()
{
	int i = -2;
	printf("%d",~i);
	return 0;
}

结果为1

-2:
原码:10000000 00000000 00000000 00000010
反码:11111111 11111111 11111111 11111101
补码:11111111 11111111 11111111 11111110
~(-2):
内存中的形式(即补码):00000000 00000000 00000000 00000001
首位是0,是正数,补码就是原码,则结果为1

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/714326.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号