int main()
{
int a,b;
a = 234; //0000 0000 1110 1010 数据以补码形式存储
b = ~a; //1111 1111 0001 0101(取反得到的是补码) --> 1000 0000 1110 1011(原码)
//符号位为1,负数 补码求原码
printf("%d\n",b);
a = ~b; //0000 0000 1110 1010 -->符号位为0,正数 原码=补码
printf("%d\n",a);
return 0;
}
输出结果:
-235
234
原码:
最高位表示符号位. 剩下的位数.是这个数的绝对值的二进制.
反码:
正数的反码就是其原码.
负数的反码就是在其原码的基础之上 符号位不变,其他位取反.
补码:
正数的补码就是其原码.
负数的补码就是在其反码的基础之上+1
在计算机中,数据以补码的形式存储;
取反:将每一位取反,包括符号位
例如234;in类型占4字节,32位
原码(补码):0000 0000 1110 1010
取反 : 1111 1111 0001 0101(补码形式)
输出转化为原码:1000 0000 1110 1011(原码)(-235)
转自:https://bbs.youkuaiyun.com/topics/392010191?page=1
我们以一个八位的机器来举例:
如果一个机器是八位的话,那么-1的用二进制表达为:1111 1111
二进制数:1111 1111
如果表示的有符号数则为:-2^7*1+2^6*1+2^5*1+2^4*1+2^3*1+2^2*1+2^1*1+2^0*1=-1
如果是无符号的数则为:2^7*1+2^6*1+2^5*1+2^4*1+2^3*1+2^2*1+2^1*1+2^0*1=255
这里就是无符号数和有符号数计算的差别,书上说的是这些基本计算得出来的一个规律。
我这里举例的是8位的机器,如果是32位的机器就只需要扩展符号位就可以了,计算方式是一样的
欢迎指正!