负数在计算机中是用补码的形式存储的,正数在计算机中是用原码的形式存储的。
正数求原码直接将十进制转二进制即可,负数的补码是在原码的基础上除符号位外其余位取反后+1。
但是用这种方式求负数补码用编程实现不太方便,下面介绍一种用编程实现起来较简便的求负数补码的方法:
1. 求出负数绝对值的原码
2. 从原码的最后一位数码位往前数,当遇到第一个1时停在此位置
3. 将第一个1前面的数码全部求反
比如:(字长为8位)
求-127的补码:
127的原码: 01111111
-127的补码: 10000001
求-80的补码:
80的原码: 01010000
-80的补码: 10110000
求-1的补码:
1的原码: 00000001
-1的补码: 11111111
这种方式用编程实现起来比较方便,在原码的基础上除符号位外其余位取反后+1的方式要考虑进位。
#include<stdio.h>
#include<memory.h>
#include<string.h>
#include<stdlib.h>
int arr[8]; //范围为 -128 ~ +127
void Complement(int number) //求负数补码
{
number=abs(number); //取绝对值
int i=7;
while(number!=0) //求出其绝对值原码
{
arr[i]=number%2;
i--;
number/=2;
}
for(i=7;i>=0;i--)
{
if(arr[i]==1)
{
int j;
for(j=0;j<i;j++) //取反
if(arr[j]==1)
arr[j]=0;
else
arr[j]=1;
break;
}
}
for(i=0;i<=7;i++)
printf("%d",arr[i]);
printf("\n");
memset(arr,0,sizeof(arr)); //重置数组
}
int main()
{
int i;
for(i=-128;i<=-1;i++) // 求 -128 ~ -1 的补码
Complement(i);
return 0;
}