这几个东西向来很绕。这里不叙述由来和原理,而是直接总结 原、反、补码的正逆转化方法 和 有无符号数之间的辨析。
1. 原码、反码、补码 正逆转化方法
1.0 前言
1.1 正转方法
1.1.1 讲解
正数 | 负数 | |
---|---|---|
原码 | (原码) | (原码) |
反码 | 等于原码 | 原码除符号位外的位取反 |
补码 | 等于原码 | 反码+1 (即等于原码除符号位外取反,然后+1) |
1.1.2 举例
正数 | 负数 | |
---|---|---|
原码 | 0110 0011 - - - (原码) | 1110 0011 - - - - - - - - - - - - - – (原码) |
反码 | 0110 0011(等于原码) | 1001 1100(原码除符号位外的位取反) |
补码 | 0110 0011(等于原码) | 1001 1101 - - - - - - - - - - - – (反码+1) |
1.1.3 注
有符号数
的最高位为符号位
,其余位为有符号数
的值;无符号数
所有位都用来表示无符号数
的值- 还有另一种计算补码的方法:
原码符号位不变, 数值位从右边数第一个1及其右边的0保持不变,左边按位取反
。这种方法如何反过来计算我就暂时不推了。
1.2 反转方法
1.1.1 讲解
那么反过来转化也是一样的道理
正数 | 负数 | |
---|---|---|
补码 | (补码) | (补码) |
反码 | 等于补码 | 补码-1 |
原码 | 等于补码 | 反码除符号位外取反(即等于补码-1,然后除符号位外取反) |
1.1.2 栗子
1.1.3 注
- 这里举例为了方便,使用了8位(又称8-bit、1字节)的数。
- 通常的int类型为32位(4字节)或64位(8字节),有时也会出现16位(2字节)。
- 再次提示:以上讨论的是“有符号数”为正、负的情况。"无符号数"没有原码、反码和补码的概念!
2. 有符号数、无符号数【难点辨析】
2.1 辨析
有符号数 | 无符号数 |
---|---|
能表示正数和负数 | 仅表示正数 |
最高位是符号位 (符号位:1为负数,0为正数)。其余位按照2进制 计算该数的绝对值大小 | 所有位都按照2进制 计算大小 |
在机器中(即内存中)用补码 表示 | 在机器中(即内存中)直接按2进制 存储,不用进行任何变换 |
2.2 实例
举个栗子 —— 以一个内存中8位的机器数为例:
有符号数 | 无符号数 | |
---|---|---|
区别 | 视作补码 (翻译成原码,并且除去符号位后,剩下的才可视为二进制数) | 视作一个二进制数 |
翻译为反码 | 1100 0100 - - - - - - - - - - -(补码 -1) | (不适用) |
翻译为原码 | 1011 1011(反码 除符号位 外取反) | (不适用) |
. | . | . |
最终结果 | -59 | 187 |