在计算机中正数和负数的存在方式是不同的,其目的是为了表现出正零和负零的相同,现在先介绍一下有关原码、反码、补码的知识:
所谓原码就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。
对于8位的char型,正零和负零的原码分别是:0000 0000 1000 0000
反码分别是:0000 0000 1111 1111
补码分别是:0000 0000 0000 0000
由此可见,不管正零还是负零,由于反补码的存在,其在计算机中是相等的。
为了保持正零和负零在计算机中的相同性,别的负数也要跟着受“牵连”,所以规定所有的负数在计算机中的存在方式必须是补码。
当我们往计算机中输入数时,计算机会自动将值转换为补码,当取出时,又会将值转换成原码拿出,而且在计算机中计算时都用的是补码。
我们现在运用例子说明:
(1),
char a = 72;
char b = 98;
char c = a + b;
printf("%d", c);
在上述例子中,输出值是-86,让我们来分析一下原因:由于正数在计算机中原、反、补码都是相同的,所以
72在计算机中的表示为:0100 1000
98在计算机中的表示为:0110 0010
两者相加为(补码): =1010 1010
取出时,先转为反码: 1010 1001
然后转换为原码: 1101 0110(输出就是-86)
(2),
char a = -83;
char b = -80;
char c = a + b;
printf("%d", c);
在上述例子中,输出值是93,让我们来分析一下原因:由于正数在计算机中原、反、补码都是相同的,所以
-83的原码为:1101 0011 要存入计算机,先转成反码:1010 1100 再转化为补码:1010 1101
-80的原码为:1101 0000 要存入计算机,先转成反码:1010 1111 再转化为补码:1011 0000
两者相加为(补码): =0101 1101
取出时,先转为反码: 0011 1101 然后转换为原码: 0101 1101(输出就是93