如何理解32位有符号整数

题目描述
给定两个正整数a,b,且a>b,计算a-b,
难点在于,这里a,b未必能够用32位有符号整数表示。

输入
输入有多组数据,每组为一对a,b占一行,且a>b,范围均为1~10^24

输出
输出a和b的差
困惑:这里的a,b 该用什么定义,还需加点什么?

说下原理,为了方便,我们用4位无符号整数/4位有符号整数来说明,你可以推广到32位。

在四位无符号整数中,咱们是这么表示的
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
分别是二进制的
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
而有符号整数,前面不变,还是 0 1 2 3 4 5 6 7,后面变了,变成了-8 -7 -6 -5 -4 -3 -2 -1
按照和有符号整数(以及上面二进制)对应排列起来就是 0 1 2 3 4 5 6 7 -8 -7 -6 -5 -4 -3 -2 -1
所以,要算减法,我们只要把每个数字+8(无论正负),因为减数被减数都+8,所以差不变。
0 1 2 3 4 5 6 7 这个 +8简单,直接+,结果变成 8 9 10 11 12 13 14 15
-8 -7 -6 -5 -4 -3 -2 -1 这个+8要注意,它们在无符号中事实上相当于 8 9 10 11 12 13 14 15
而我们实际上要得到0 1 2 3 4 5 6 7,所以我们实际上是减8

所以我们需要判断,如果原来的数字 > 0x7(也就是十进制的7),那么-8,否则+8

推广到32位,就是
如果大于 0x7FFFFFFF,那么减去 0x80000000
如果小于 0x7FFFFFFF,那么加上 0x80000000
然后再让调整过的两个数直接相减。
之前写错了。

用32位无符号整数表示,结果也要用32位无符号整数表示。
用无符号表示以后,首先判断,如果大于 0x7FFFFFFF,那么减去 0x7FFFFFFF
如果小于 0x7FFFFFFF,那么加上 0x7FFFFFFF
然后再让调整过的两个数直接相减。

int~long long int 所表示不了的,可以考虑的是大数运算

在Java里可以用 BigInteger 定义
Java版本:

 import java.math.*;  
import java.util.*;  
public class Hello   
{  
    //static int a = 2;  
    public static void main(String[] args)   
    {  
        Scanner cin = new Scanner(System.in);  
        BigInteger a,b;  
        a=cin.nextBigInteger();  
        b=cin.nextBigInteger();  
        System.out.println(a.multiply(b));  
                System.out.println(a.subtract(b)); //大整数减法
    }  
}

当然,既然java能够表示,C++字符串同样也能解决这个问题
这个网上的内容比较多‘可以自己百度下‘

这里我还要说的是Ruby

 a=gets
 b=gets
 puts a+b

’’

http://bbs.csdn.net/topics/380208769 看一下这个