正数的补码是其本身。这个是定义好的吗?还是通过运算可以证明?首先,整数的编码是先有最直观的非负数,然后再加上负数作为补充。补充负数的时候非负数的表达方法不能改变,这是很自然的。就如同硬件设计上都讲平稳退化一样。
正数的补码问题
其次,补码是完全的人为定义。正数的补码是其本身,这只是为了符合补码的设计原则:
1.任何两个补码直接二进制简单相加,即可得到正确运算结果并仍是补码
2.0不存在所谓“正0”和“负0”的二义性
3.符合惯例和直观感受
正数的补码实例
在一本书上的一个输出数据的补码示例中:
C/C++code
?
intmain()
{
unsignedshortinta,b=1;
printf("inputanoctalnumber:");
scanf("%o",&a);
b=a&0100000;
if(b==0100000)
a=~a+1;
printf("result:%o\n",a);
return0;
}
正数的补码为原码本身,负数的补码位整数的原码按位取反末位加1.
输入:177777
输出:result:1
计算机中的所有数据都是由补码表示。
由补码的定义,正数的补码是其本身,而无符号数(可以看成是一个正数)的补码就是他自己。。
但无论正负,数在计算机中的表示都是以二进制的形式保存。无论你怎么操作,都是对二进制操作。
LZ你的问题就是,对于一个正数,采用了负数补码的计算方式
你要知道,177777的补码的真正定义是0177777。
然后,lz用signed代替unsigned来测试一下程序。
因为你声明的是无符号,在计算的时候的提升规则不同。
总之,正数的补码给大家简单的介绍了一些,希望大家多看看。