在计算机中,数据都是以二进制形式存放的,有符号数也不例外。如何将有符号数存储在计算机的数据区中,一直是计算机领域中的一个重要问题。
早期计算机中,有符号数的存储通常采用原码方式。原码的表示方法是,将数值和符号分开存储,用最高位表示符号位,0表示正数,1表示负数。但这种表示方法有一个问题,即0有两种表示方式+0和-0,导致计算时需要特殊处理。
为了解决原码存在的问题,人们后来又引入了反码和补码的概念。在反码中,正数的表示方法与原码相同,负数表示方法则是将其绝对值的二进制表示取反。在补码中,正数的表示方法与原码相同,负数表示方法则是将其绝对值的二进制表示取反后再加1。补码是现代计算机中广泛采用的一种有符号数表示方式,它不仅避免了原码存在的问题,而且还可以统一加减法的计算方法。
在补码表示法中,最高位仍然用来表示符号,但是符号位和数值位的区分方式却不同于原码。符号位之后的各二进制位包括最低位的数值位都代表数字本身的绝对值,而且运算规则和无符号数相同。这种表示方式简单明了,适合计算机进行加减法运算。
为了便于计算机进行数学运算,有时候需要将位数扩展。例如,将一个8位的数扩展到16位。对于有符号数来说,这个操作可能会引入误差。由于补码表示法中符号位后面的位数是代表绝对值的,所以扩展时需要先将符号位复制填充到高位。如果复制得不正确,就有可能导致数值上的错误。
在计算机中,有符号数是以二进制形式存储的。不同的计算机可能采用不同的存储顺序。有些计算机采用大端模式,即高位字节存放在内存的低地址端,低位字节存放在内存的高地址端。还有些计算机采用小端模式,恰恰相反。在处理有符号数时,存储顺序的不同可能会导致解释方式的差异,需要特别注意。