原码,反码,补码,你理解到位了吗?
如果觉得对你有帮助,能否点个赞或关个注,以示鼓励笔者呢?!博客目录 | 先点这里
首先声明,写一篇博客,不代表知识一定是对的,只是在梳理自己学习在过程的理解,尽量做到正确
- 前提概念
- 如何理解原码,反码,补码?
- 机器数与真值
- 什么是机器数?
- 什么是真值?
- 同余定理的应用
- 什么是同余定理?
- 模,互为补数,同余
- 原码,反码,补码
- 原码
- 反码
- 补码
- 为什么需要原码,反码,补码?
- 相关问题
- 补码计算的溢出
- 为什么java语言中的byte的范围是从-128~127?
前提概念
字节
字长为8的计算机中,一个字节,有8位。2^8 = 256 , 既8位空间进行二进制的排列组合,最多可以有256种可能。
- 无符号位情况下,可表示最大的值为255,最小值为0
- 有符号为情况下,可表示最大的值为127,最小值为-127(8)
8位二进制, 使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127]
二进制运算
计算机默认只会做加法,例: 5 - 3 => 5 + (-3) 乘法除法:是通过左移 << 和右移 >> 来实现
&与运算。 全1为1, 有0为0|或运算。 有1为1, 全0为0~非运算。 逐位取反^异或运算。 相同为0,相异为1
实践:
- 1000 mod 256 等同于 1000 & (256 - 1) ,通式是
a mod b = a & (b - 1),不过需要在特定的条件下才能成立,需要满足b是2的次方数值
如何理解原码,反码,补码?
- 首先我们必须要先知道现代操作系统的数值运算是以
补码的形式进行的 - 在学习原码,反码,补码之前,我们有必要先来了解一下
机器数,真值的知识 - 然后了解一下
同余定理在机器数中的运用,知道模,互补数,这能让我们更好的理解补码运算中的溢出和为什么能化减为加的行为 - 然后我们就可以学习一下原码,反码,补码的基本概念
- 再了解一下为什么需要原码,反码和补码,以及他们的具体作用是什么
机器数与真值
什么是机器数?
一个数在"计算机"中的"二进制"表示形式, 叫做这个数的机器数。 机器数有以下两个特点
数的符号数值化
我们知道数值具有正负数之分,由于计算机内部的硬件只能表示0,1两种物理状态,因此数值的正负数,通常在机器中使用最高位的0,1来区分表示。正数为0, 负数为1二进制的位数受机器设备的限制
机器设备一次能表示的二进制位数叫机器的字长,一台机器的字长是固定的。字长8位叫一个字节,机器字长一般都是字节的整数倍,如字长8位、16位、32位、64位

说白了,机器数由两部分组成,最高位的符号位和剩余位的数值位。
- 举个粟子,十进制的
+8, 转换成机器数就是00001000。十进制的-8,转换成机器数就是10001000 - 机器数 - @百度百科
什么是真值和形式值?
我们知道机器数的重点是,一个数以 “二进制的形式” ,在 “计算机” 中存储,存在 “符号位”。所以我们要区别机器数和数学意义上的二进制数。
因为机器数是带有符号位的,普通数学角度的二进制数是没有符合位概念的。所以机器数在计算机中所表示的真实值和机器数所表示的形式值是不相同的。比如说,十进制的-8,转换成机器数就是10001000,而10001000按照数学角度去转换为10进制应该是136, 而不是-8。
| 十进制数 | 机器数 | 2进制数 |
|---|---|---|
+8 |
00001000 |
+00001000 |
-8 |
10001000 |
-00001000 |
| 机器数 | 形式值 | 真值 |
|---|---|---|
10001000 |
+136 | <

本文深入浅出地解释了原码、反码、补码的概念及其在计算机中的应用,探讨了它们如何帮助计算机处理有符号数的运算,特别是补码在解决溢出问题中的关键作用。
最低0.47元/天 解锁文章
7070





