原码,反码,补码,有符号数,无符号数 之间的关系【超全总结】



这几个东西向来很绕。这里不叙述由来和原理,而是直接总结 原、反、补码的正逆转化方法有无符号数之间的辨析



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. 有符号数的最高位为符号位,其余位为有符号数的值;无符号数所有位都用来表示无符号数的值
  2. 还有另一种计算补码的方法:原码符号位不变, 数值位从右边数第一个1及其右边的0保持不变,左边按位取反。这种方法如何反过来计算我就暂时不推了。


1.2 反转方法

1.1.1 讲解

那么反过来转化也是一样的道理

正数 负数
补码 (补码) (补码)
反码 等于补码 补码-1
原码 等于补码 反码除符号位外取反(即等于补码-1,然后除符号位外取反

1.1.2 栗子
在这里插入图片描述

1.1.3 注

  1. 这里举例为了方便,使用了8位(又称8-bit、1字节)的数。
  2. 通常的int类型为32位(4字节)或64位(8字节),有时也会出现16位(2字节)。
  3. 再次提示:以上讨论的是“有符号数”为正、负的情况。"无符号数"没有原码、反码和补码的概念!



2. 有符号数、无符号数【难点辨析】

2.1 辨析

有符号数 无符号数
能表示正数和负数 仅表示正数
最高位是符号位(符号位:1为负数,0为正数)。其余位按照2进制计算该数的绝对值大小 所有位都按照2进制计算大小
在机器中(即内存中)用补码表示 在机器中(即内存中)直接按2进制存储,不用进行任何变换


2.2 实例

举个栗子 —— 以一个内存中8位的机器数为例:

1100 0101

有符号数 无符号数
区别 视作补码 (翻译成原码,并且除去符号位后,剩下的才可视为二进制数) 视作一个二进制数
翻译为反码 1100 0100 - - - - - - - - - - -(补码-1) (不适用)
翻译为原码 1011 1011(反码符号位外取反) (不适用)
. . .
最终结果 -59 187



3. 参考资料

  1. 二进制补码怎么计算的

  2. int是多少位

  3. 什么是有符号数和无符号数

  4. 什么是取反

  5. 高人指点

猜你喜欢

转载自blog.csdn.net/weixin_39591031/article/details/113655734