整数转二进制手算原码反码补码理解小结

Posted guangdeshishe

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了整数转二进制手算原码反码补码理解小结相关的知识,希望对你有一定的参考价值。

整数转二进制原理

整数转二进制原理:让这个数连续取余2直到为0,将余数逆序输出,过程如下:

原码、反码、补码

  • int类型的数占用4字节(32位)
  • 第一位是符号位,0表示正数,1表示负数;
    由于最高位用来表示正负数,所以只有剩下的31位才能表示整数值,所以整数最大值 二进制[原码][0111 1111 1111 1111 1111 1111 1111 1111];转成十进制就是2的31次方-1=2147483647;理论上最小值应该是 二进制[原码][1111 1111 1111 1111 1111 1111 1111 1111],转成十进制就是-2147483647;但是由于0比较特殊;可以用[原码][0000 0000 0000 0000 0000 0000 0000 0000]表示也可以用[原码][1000 0000 0000 0000 0000 0000 0000 0000];但是0只需要一个二进制表示就可以,多出来的[1000 0000 0000 0000 0000 0000 0000 0000]就可以用来表示整形最小值-2147483648的补码,这个二进制码比较特殊,它没有对应的原码,之所以用它来表示-2147483648而不是表示正数2147483648;是因为-2147483647-1后的补码是[1 1000 0000 0000 0000 0000 0000 0000 0000]比32位要多溢出一位,舍去后刚好就是[1000 0000 0000 0000 0000 0000 0000 0000];(不过后来发现整数的最大值+1的结果也是[1 1000 0000 0000 0000 0000 0000 0000 0000]为什么不用[1000 0000 0000 0000 0000 0000 0000 0000]表示2147483648呢?,我想因为第一位是符号位,值为1表示负数更合适一些吧)
  • 正数的原码=反码=补码
  • 负数的反码=符号位不变,其他位取反
  • 负数的补码=反码+1
  • 0可以用[原码][0000 0000 0000 0000 0000 0000 0000 0000]表示也可以用[原码][1000 0000 0000 0000 0000 0000 0000 0000];因为正负0都是没有意义
  • 计算机内部整形数据都是用补码来存储的,计算也是通过补码来计算的,好处是可以将减法当做加法来处理;而且可以解决0有两种表示方式问题,因为正负0转成补码后都是32个0;
  • 例如:
    [+3]原码:[0000 0000 0000 0000 0000 0000 0000 0011]
    [+3]反码:[0000 0000 0000 0000 0000 0000 0000 0011]
    [+3]补码:[0000 0000 0000 0000 0000 0000 0000 0011]
    [-3]原码:[1000 0000 0000 0000 0000 0000 0000 0011]
    [-3]反码:[1111 1111 1111 1111 1111 1111 1111 1100]
    [-3]补码:[1111 1111 1111 1111 1111 1111 1111 1101]
  • 给定一个32位二进制数值,如何判断是正数还是负数?比如:[1111 1111 1111 1111 1111 1111 1111 1101]
    • 首先需要肯定的是,计算机中存储整形数据都是补码形式存储的,所以给的二进制数据一定是补码
    • 然后看它的第一位是0还是1,如果是0则表示是一个整数,整数的补码和原码是一样的,所以最后把原码转成十进制整数就可以了;
    • 如果是1则表示是负数,而且也是补码,负数的补码=反码+1;而负数的反码=原码取反(除了第一个符号位);所以负数的原码=(补码-1)再取反(除了第一位外)
    • 例子中:[1111 1111 1111 1111 1111 1111 1111 1101]首位是1,表示负数,那么它的反码就是: [1111 1111 1111 1111 1111 1111 1111 1100]
    • 原码就是:[1000 0000 0000 0000 0000 0000 0000 0011]
    • 原码转成十进制就是-3了
  • int最大值+1后等于多少?
    • int最大值补码表示是:0111 1111 1111 1111 1111 1111 1111 1111
    • 1的补码值是 :0000 0000 0000 0000 0000 0000 0000 0001
    • 相加后的补码是 :1000 0000 0000 0000 0000 0000 0000 0000
    • [1000 0000 0000 0000 0000 0000 0000 0000]比较特殊,在二进制中就是特指Int的最小值的补码,也就是十进制的:-2147483648
  • int最小值-1后等于多少?
    • int最小值补码:1000 0000 0000 0000 0000 0000 0000 0000
    • -1的补码: 1111 1111 1111 1111 1111 1111 1111 1111
    • 相加后结果: 1 0111 1111 1111 1111 1111 1111 1111 1111
    • 最前一位溢出了直接舍去,结果就是:[0111 1111 1111 1111 1111 1111 1111 1111]
      符号位开头的是0,表示整数,补码和原码都一样,后面31位都是1,所以表示的是整数的最大值2147483647

以上是关于整数转二进制手算原码反码补码理解小结的主要内容,如果未能解决你的问题,请参考以下文章

初始C语言

关于原码反码补码以及位元算

原码反码补码BCD码格雷码

关于原码,反码和补码

整数的存储和运算

正负数的源码 反码 补码 转