1.先从计算机存储的机制说起:
直接说有符号数,先说一个字节的的补码表示范围为-2^7~(2^7-1),即-128~127。
当X>0时,X[原码]=[反码]=[补码];
当X=0时,存在[+0]和[-0]两种表示形式,[+0]原=0000 000,[+0]反=0000 0000,[+0]补=0000 0000
[-0]原=1000 000,[-0]反=1111 111,[-0]补=0000 0000
当X<0时:
a.负数的原码:最高位D7为1,剩余D6~D1为其绝对值二进制表示。 例如:-1的原码为1000 0001;
b.负数的反码:最高位D7仍保留为1,剩余D6~D1为其绝对值二进制按位取反。例如:-1的反码为1111 1110;
c.负数的补码:补码为对应反码加1。例如:-1的补码为1111 1111。
有符号数在计算机中是以补码形式存在的。
数值 | 原码 | 反码 | 补码 |
-1 | 1000 0001 | 1111 1110 | 1111 1111 |
-2 | 1000 0010 | 1111 1101 | 1111 1110 |
…… | …… | …… | …… |
-128 | 1000 0000 |
总结:当X<0时,X[补码]=256-|X|=255--|X|+1=1111 1111--|X|+1=X[反码]+1,256为一个字节的模的大小,为2^8。
原码表示范围:最小值:1111 1111=-127,最大值为0111 1111为+127,故范围为-127~(+127),其中包括[+0]原和[-0]原,共2^8个数;
反码表示范围:最小值:1000 0000=-127,最大值为0111 1111为+127,故范围为-127~(+127),其中包括[+0]反和[-0]反,共2^8个数;
补码表示范围:最小值按理来说应该是1000 0001=-127,但因为[+0]补=[-0]补=0000 0000,从-127~+127共255个数,少一个数怎么办呢?-1的补码是确定无异的,为1111 1111,-128作为一个字节所能表示的有符号数的最小值,应是1111 1111(-1)一直减1得到的,所以-128的补码为1000 0000。
2.结合51单片机,重点对程序状态字PSW之中的CY和OV位进行分析
位地址 |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
位符号 |
CY |
AC |
F0 |
RS1 |
RS0 |
OV |
- |
P |
PSW作为一个8位的特殊功能寄存器,记录了当前有关CPU状态的各种信息,分为两类:一类是当前指令执行结果的状态信息,如CY/AC/OV/P;另一类是存放控制信息,如RS1/RS0/F0。先介绍除了CY+OV之外的标志位:
AC(PSW.7)辅助进位标志:当进行加法或减法操作而产生低四位向高四位进位或者借位时,AC将被硬件置位(AC=1),否则清零(AC=0),AC主要用于二-十进制加法调整;
F0(PSW.5)用户标志位:是用户自定义的一个标志位,可以用软件置位或者清零,常用来控制程序的流向;
RS1、RS0(PSW.4、PSW.3)工作寄存器选择控制标志:可以软件置1或者清零来确定工作寄存器区;
P(PSW.0)奇偶标志位:每个指令周期都由硬件来置位或者清零,以表示累加器A中1的位数的奇偶数。如果位数为奇数,则P=1,如果值为1的个数为偶数,则P=0.
下面重点介绍