c++补码运算

#include<iostream>#include<cstring>usingnamespacestd;intmain(){inta;a=~10+1;cout<<a;r... #include<iostream>#include<cstring>using namespace std;int main(){ int a; a=~10+1; cout<<a; return 0;}
为什么输出-10?
展开
 我来答
maoyulng
2013-12-31 · 超过21用户采纳过TA的回答
知道答主
回答量:37
采纳率:0%
帮助的人:30.5万
展开全部
int a 是带符号数;由编译器的不同,可能是2字节编码(short int)或4字节(long int);
以2字节编码为例来解释一下:10 = 0000 0000 0000 1010B (注1) ; ~是取反码(按位),所以
~10 = 1111 1111 1111 0101B 于是 ~10+1 = 1111 1111 1111 0110B (注2)这恰好是-10的补码表示,所以输出-10;
要验证这个问题,其实就是把上面10 和-10的编码(分别为注解1,2)相加。在有字长确定的情况下,相加后,最高位的进位被“自然”丢失,于是,结果为0。
补码实际是在有限字长的条件下,允许一对非0的数相加,其和为0。满足该条件的一对数,是有限字长条件下的互为相反数。
hnlylyb2
2013-12-31 · TA获得超过121个赞
知道小有建树答主
回答量:167
采纳率:0%
帮助的人:162万
展开全部
补码的算法是按位取反然后+1啊,然后在计算机内部,负数是按照补码来储存的,所以你对10按位取反,然后再+1当然是-10的补码啊
追问
~就是按位取反的意思么?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
做而论道
高能答主

2023-01-09 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.2亿
展开全部

在计算机系统中,数值,是以二进制形式来表示的。

  +1,是 0000 0001。

  -1,则是 1111 1111。

如果想要改变数字的符号,变成“相反的数”,可如下进行:

  -X = ~X + 1

操作之后,原数如果是-10,得到的结果就是+10。

如果,原来的数是+10,就会得到-10。

这算法,基于二进制数制的特点。

这算法,和求补码的:“原码取反加一符号位不变”,没有任何关系。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式