信息的最小单位是比特(bit),它只能表示两种状态:0 或 1。 1.简洁性 2.直接与硬件映射 3.易于扩展 4.内存效率

多个比特被组合在一起形成字节(byte),通常一个字节由8个比特组成。 1B=8b 多个字节组成一个字。

最低有效位 表示最右边的一位,最高有效位 表示最左边的一位。 MIPS 的字有 32 位 ,如果要存储1011。那就是: 0000 0000 0000 0000 0000 0000 0000 1011(高位补0)

计算机硬件设计使得其能够高效地执行基于二进制的加法、减法、乘法、除法以及其他逻辑操作,所有这些都直接对应于底层电路中的电子信号的变化。这些基础操作构成了现代计算机计算能力的核心。


整数进制转换 二进制:1111011 十进制:123

二进制转换为十进制:逐位乘以2的幂次方求和。
十进制转换为二进制:除2取余法

计算机硬件设计使得其能够高效地执行基于二进制的加法、减法、乘法、除法以及其他逻辑操作,所有这些都直接对应于底层电路中的电子信号的变化。这些基础操作构成了现代计算机计算能力的核心。

为了表示正数和负数,计算机程序使用了一种称为“符号和幅值”(sign and magnitude)的表示法,即原码: 高位(通常是第一位或最左边的位)用作符号位,0表示正数,1表示负数。其余位表示数值的幅值(即绝对值)。

例如:占8位的二进制数: 9D: 0000 1001B -9D:1000 1001B

固定位数(n+1位)的原码范围:

[-(2n-1), (2n-1)]

0的原码表示有两种:0000 0000 和 1000 0000

当运算的结果超出了该数据类型能够表示的范围时,就会发生溢出。(计算机内部一般用补码存储数据,稍后讨论)


原码加减法:与十进制一样,考虑进位和借位。

注:在原码加减运算中,对于两个不同符号数的加法(或同符号数的减法),先要比较两个数的绝对值大小,然后用绝对值大的数减去绝对值小的数,最后还要为结果选择合适的符号。


原码表示法的优点: 原码表示的优点是,与真值的对应关系直观、方便,因此与真值的转换简单,并且用原码 实现乘除运算比较简便。

原码表示法的缺点: 0的表示不唯一,给使用带来不便;加减运算比较复杂,要考虑溢出、负借位等等问题

为了简化硬件设计并解决这些问题,现代计算机更倾向于使用二进制补码(two’s complement)的方式来表示有符号整数。 二进制补码不仅解决了正负数的区分问题,还使得加减运算能够通过相同的硬件电路实现,同时有效地处理了溢出情况,并消除了正负零的问题。


补码的定义:具有一位符号位和n-1数字位的二进制整数x来说 其补码是: [x]补 = 2^n + x(mod 2^n) -2^(n - 1)<= x < 2^(n - 1)

补码表示正数和负数: 1.正数:与其原码相同,即最高位(符号位)为0,剩余各位表示数值的绝对值。 例如,十进制正数5,在8位二进制补码中的表示为: 0000 0101 2.负数:通过取其绝对值的二进制反码(将所有1变为0,0变为1),然后再加1得到的。 例如,十进制正数5,在8位二进制补码中的表示为: 1111 1011


补码的优势 1.简化加法计算 2.无额外的零表示 3.溢出处理(保持循环不变性)

注:n+1位的二进制补码可以表示的范围:[-(2n), (2n-1)]
   n+1位的二进制原码范围:[-(2n-1), (2n-1)]

关于补码溢出的讨论:补码表示法的优点之一是它可以很容易地检测到溢出,并且对于加法运算,溢出只可能发生在正溢出(两个正数相加得到负数)或负溢出(两个负数相加得到正数)的情况下。

正溢出:当两个正数相加的结果超过了正数的最大表示范围时,就会发生正溢出。

负溢出:当两个负数相加的结果超过了负数的最小表示范围时,就会发生负溢出。

检测溢出:在补码表示法中,可以通过检查加法运算中的进位来检测溢出。如果两个正数相加时最高位(符号位)产生了进位,或者两个负数相加时最高位没有产生进位,那么就可以确定发生了溢出。

处理溢出:处理溢出的方法取决于特定的应用程序和编程环境。在某些情况下,程序员可能希望捕获溢出并采取相应的措施,如设置错误标志、抛出异常或采取其他错误处理机制。在其他情况下,溢出可能被视为未定义行为,可能导致不可预测的结果。


因为补码表示法具有以上优势:目前大多数现代计算机系统在进行数值的存储和运算时,普遍采用二进制补码表示法。对于整数运算来说,补码是主导的表示法。

值得注意的是,浮点数在计算机内部通常不是以补码形式存储的,而是遵循IEEE 754标准,该标准使用一种不同的编码方案(符号位、指数和尾数)来表示浮点数。


在进行算术运算和逻辑运算时,需要确保操作数的位数一致。

符号扩展(Sign Extension)是一种将较短位数的二进制数转换成较长位数二进制数的方法,同时保持数的数值不变。 在符号扩展中,我们观察原始数的最高有效位,即符号位,然后将其复制到新数的高位部分。 例如: 16位的二进制补码数 10000000 00000001拓展为32位:11111111 11111111 10000000 00000001 16位的二进制补码数 00000000 00000001拓展为32位:00000000 00000000 00000000 00000001

注:这种方法之所以正确,是因为二进制补码表示的正数实际上在左侧有无限多个0,而负数在左侧有无限多个1,只是为了适应硬件的位数宽度,数的前导位被隐藏了,符号扩展只是简单地恢复了其中一部分。