首页 > 编程知识 正文

计算机中无符号数是啥,计算机无符号和有符号的区别

时间:2023-05-05 16:02:29 阅读:190156 作者:3462

确如题主所说,计算机中存储的任何数据都是二进制形式,单看数据是无法认定其格式和内容的。

计算机要用二进制编码来表达数值的符号,最直观的方法就是符号位。但为了保证基本算术运算在正负数上的一致性,x86计算机对负数采用了特殊的编码方式,即补码。

为什么补码这么巧妙实现了正负数的加减运算?参见维基百科:
补码
-1的二进制表示

下面结合题主提到的寄存器状态举个例子。
为简化起见,我们8位二进制数来讲。
先看8位二进制与无符号数和有符号数的对应二进制
无符号 有符号
00000000 0 000000001 1 1

01111110 126 126
01111111 127 127
10000000 128 -128
10000001 129 -127

11111110 254 -2
11111111 255 -1

按照上述对应关系,我们可以把二进制运算解释为有符号或无符号的十进制运算。
只有算术运算才会有正负号问题,而算术运算中最主要的就是加法系列指令和减法系列指令。

范围内的运算咱们不关心,主要看看超出范围的运算如何处理。
当运算超出范围后,CPU会改变标志寄存器中的值(置1),来表示当前的运算结果。

算术运算主要用到的标志位如下。
OV(溢出):运算结果超过数值表达范围(比如8位数运算超过256);
ZR(零):运算结果为0时;
PL(符号):运算结果的最高位为1。
AC(辅助进位):低4位是否向高4位进/借位;
CY(进位):高位进/借位;

当加法系指令的二进制结果大于11111111时会产生溢出,结果保留超过11111111的部分,并置溢出位为1。例如加法add指令:11111110+00000011=100000001=>00000001
标志位:
由于低4位和高4位都进位了,所以AC和CY置1
对应的无符号运算:
254+3=1
对应的有符号运算:
-2+3=1

减法系的指令会产生“减不过”的情况。
减不过时cpu会给左数的最高位添加一个1,使得比右数大,再做减法并置溢出。
例如减法sub指令:
00000010-00000011=>100000010-00000011=11111111
标志位:
由于低4位和高4位都借位了,所以AC和CY置1,由于运算结果高位为1,PL置1
对应的无符号运算:
2-3=255
对应的有符号运算:
2-3=-1

其他的算术运算较复杂,但都可以用类似的方法分析。因超出问题范围,此处不再赘述。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。