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