是否有计算Java int溢出的公式?
示例:如果我向Integer.MAX_VALUE;
添加1,答案不是2147483648,而是-2147483648。
问题:如果我想计算Java为大于2 ^ 32的值打印什么,是否有一个简单的数学表达式(理论上,而不是代码中)?
答案 0 :(得分:4)
在java中,int
是32位,但它也是有符号的,这意味着第一位是“负”符号。 1表示负数,0表示正数。因此,最大的数字是2147483647(0111 1111 1111 1111 1111 1111 1111 1111)。如果加1则使其为1000 0000 0000 0000 0000 0000 0000 0000,转换为-2147483648。对于任何大于您的值,您需要使用long
答案 1 :(得分:3)
((x + 2 31 )mod 2 32 ) - 2 31
这是你正在寻找的吗?这应该是在使用32位带符号2的补码整数的机器上进行任何数学运算的结果。也就是说,如果操作的数学值返回x,则上面的公式给出了实际存储的整数(如果操作没有错误,并且它不是"饱和" ;操作)。
请注意,我使用" mod"使用数学定义,而不是%
运算符在Java或C中的工作方式。即,A mod B,其中A和B是整数,B> 0,始终返回0 ... B-1范围内的整数,例如(-1)mod 5 = 4.更具体地说,A mod B = A - B * floor(A / B)。
答案 2 :(得分:0)
我相信这会奏效:
int expected = ((val + Integer.MAX_VALUE) % Integer.MAX_VALUE) - Integer.MAX_VALUE;