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? 展开
为什么输出-10? 展开
3个回答
展开全部
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。满足该条件的一对数,是有限字长条件下的互为相反数。
以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。满足该条件的一对数,是有限字长条件下的互为相反数。
展开全部
补码的算法是按位取反然后+1啊,然后在计算机内部,负数是按照补码来储存的,所以你对10按位取反,然后再+1当然是-10的补码啊
追问
~就是按位取反的意思么?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在计算机系统中,数值,是以二进制形式来表示的。
+1,是 0000 0001。
-1,则是 1111 1111。
如果想要改变数字的符号,变成“相反的数”,可如下进行:
-X = ~X + 1
操作之后,原数如果是-10,得到的结果就是+10。
如果,原来的数是+10,就会得到-10。
这算法,基于二进制数制的特点。
这算法,和求补码的:“原码取反加一符号位不变”,没有任何关系。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询