-2147483648的补码怎么算?
在学《C程序设计》,练习编了个小程序计算int型数的补码。按书上的方法,负数先求绝对值,然后写成二进制,在各位取反后加1
我试了试,别的都行,最小数-2147483648算出来不对,貌似一取绝对值就已经溢出了吧?
怎么办?还用这种方法计算?还是这个数有别的计算方法?
程序代码:
/* 时间:2011年9月30日15:41:07 目的:练习补码的计算方法 */ # include <stdio.h> int main() { int x; int i; int a[32]; printf("输入一个数\n"); scanf("%d",&x); if (x>=0) { a[0]=0; //正整数计算补码 for(i=31; i>0; --i) { a[i]=x%2; x /= 2; } } else { x = -1*x; //取绝对值 a[0]=0; //按正整数计算补码 for(i=31; i>0; --i) { a[i]=x%2; x /= 2; } for(i=0; i<32; ++i) //逐位取反 { a[i] = !a[i]; } for(i=31; i>=0; --i) //+1 { if(0==a[i]) { ++a[i]; break; } else { --a[i]; continue; } } } printf("补码是:\n"); for(i=0; i<32; ++i) { printf("%d",a[i]); if(3 == i%4) { printf(" "); } } printf("\n"); return 0; } /* 在VC++6.0中的输出结果为: ———————————— 输入一个数 -2147483648 补码是: 0000 0000 0000 0000 0000 0000 0000 0000 Press any key to continue ———————————— */