在计算机教材中,有一套谎言:
计算机中数字,分成:无符号数和有符号数。
计算机中的有符号数,即原码、反码和补码。
三种表示方法均有符号位和数值位,符号位都是用 0 表示 “正”,用 1 表示 “负”。
原码:最高位为符号位,其余表示数值大小;
反码:正数的反码和原码一样,负数的反码除最高位符号位外,其他位都取反;
补码:在反码的基础上加1。
在计算机系统中,数值一律用补码来表示和存储。
而实际上,在计算机中,只有二进制数字。
这些二进制数,可以代表:十进制数字、英文字符、汉字字符、声音、图像、控制信息、状态信息等等。
随便写一组二进制数,它究竟是什么数字呢?
从这组二进制数,是看不出来什么的。
它到底是什么,完全取决于软件(程序)对它们的处理方法。
比如,一个字节的数据 1100 0100,可能是无符号数 196,也可能是有符号数-60。
当你执行如下程序:
MOV AL,0100 0011B ; AL = 43H = 67
ADD AL,1100 0100B ; AL = 43 + C4 = 07H
相加之后,AL = 07H,同时还有 CF = 1。
此时的进位 CF = 1,就相当于十进制的 256。
如果在后续处理中,不理会 CF,那么,这次相加,就是:67-60 = 7。
此时的 C4H,就是有符号数。
如果你保留 CF,那么这次就是:67 + 196 = 256 + 7 = 263。
此时的 C4H,就是无符号数。
------------------------
以上,就是说:一个二进制数,它就是一个二进制数。
它可以代表多种信息,并不能说,谁是无符号数,谁是有符号数。
那么,它究竟是无符号数,或是有符号数,或是汉字字符?
其实,它们都是一样的,从数字来看,根本就无法区分。
------------------------
应该说,计算机中,有两种处理程序,能够分别处理无符号数和有符号数。
关键的区别,就是对 CF 的保留或舍弃。
------------------------
另外,在计算机中,原码和反码,都是不存在的。
本文完。