目录
1 无符号数和有符号数
无符号数和有符号数是计算机编程中两种常见的数据类型。它们在存储方式、溢出方式有所不同。
1.1 无符号数
无符号数即所有位置都是用于表示数值本身。
对于一个N位的无符号数,其能够表示的范围为。例如一个8位的二进制数,其数值表示范围为0~255,其中0的二进制形式为00000000,而255是11111111。
当存储大于超过本身范围的数的时候,无符号数会发生溢出行为并且循环到最小值,例如八进制数存储256时,会循环到0;如果要存储514时,会循环到2;
1.2 有符号数
有符号数不仅有数值位还有符号位,一般有符号数的符号位是这个数的最高位,其他位是数值位。正数的符号位一般为0,负数的符号位一般为1。
对于一个N位的二进数有符号数,其能够表示的范围是。
一个8位的有符号数,其数值表示的范围是-128~127。对于正数的有符号数,范围是00000000-01111111,即0~127;对于负数的有符号数,用10000001-11111111分别对-1到-128,用10000000来表示-128。
2 计算机科学中的三种表示方法
在计算机科学种有三种常见的表示方法,分别是:原码、反码和补码。原码是一种最直观的表示方法,直接用二进制表示一个数;反码主要是用于表示负数,正数的反码和原码相同。补码是计算机种进行计算操作最常用的表示方法,对于正数来说,其补码就是原码,对于负数来说,补码是反码加1。
2.1 原码
二进制正数的原码就是它本身,负数的原码也是其本身。
在8位二进制表示中,-128原码是一个特殊情况,-128的原码是用补码来表示的,它的补码为10000000,因此8为有符号能够表示的范围是-128~127。
2.2 反码
二进制正数的反码为它本身。二进制负数的反码为其符号位不变,数值位中的0变为1,1变为0。
例如,对于±31,其中31的原码为00011111,-31的原码为10011111。将其转换为对应的反码如下所示:

原码变为反码的规律可以对任何数都是使用,比如0的原码00000000,反码00000000;24的原码00011000,反码00011000;-24的原码10011000,反码11100111;-29的原码10011101,反码11100010; -128的原码00000000,反码11111111。
2.3 补码
对于正数来说,其补码就是它的原码。而对于负数,它的补码为其反码加1。
例如,对于±31的8位二进制数来说,其原码是00011111,反码为00011111,补码为00011111;-31的原码为10011111,反码为111000000,补码为11100001;转换过程如下所示:

8进制二进制有一种特殊情况是-128,它的原码是10000000,补码也是10000000。

3 加减运算的简单介绍
3.1 二进制加法
对于二进制数,可以对其进行加减运算。在进行加减运算的时候,我们一般将其转换为补码进行运算。
例如两个6位二进制数010010和001010进行加法运算(最高位为符号位,对应的十进制数为18和10),相应的补码也是010010和001010,相加过程如下所示:

可以看到通过计算得到011100,对应的原码为011100,十进制结果为28,和直接十进制相加所得的结果相同。
同时可以进行正数与负数进行相加,例如有符号的二进制数010111和101111(对应十进制的23和-15)相加,将负数转换为对应的补码为110001。计算过程如下所示:

可以看到最终结果为001000即十进制数8,通过比较十进制数结果可知计算正确。
当两个有符号数之和大于超过表示的范围的时候,会出现溢出现象(Over