原码,补码&反码

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位的机器就只需要扩展符号位就可以了,计算方式是一样的

 

欢迎指正!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值