我认为这很清楚,但是可以肯定的是我已经决定要问。
如果我有这样的事情。
int secs=2power32-1 //Unsigned int read from file as Java sign. int.
if(Integer.compareUnsigned(secs,3600)>=0){ //Get hours from secs.
start[0]=Integer.divideUnsigned(secs,3600);
secs=secs-start[0]*3600;
}
if(Integer.compareUnsigned(secs,60)>=0){ // Get min. from secs.
...
}
我不是100%确信第二次比较计算的数字正确(秒)。
请有人知道证明吗?
非常感谢你。
最佳答案
是的,secs = secs-start[0]*3600
可以满足您的期望。
Integer没有无符号方法加,减和乘方法的原因是,它们与有符号操作完全相同(逐位)。例如,如果执行65535 * 65537,则得到-1。解释为无符号整数,这些位与您期望的一样为2 ^ 31-1。
在计算机的早期,这是一个非常重要的属性,因为这意味着计算机不需要为签名操作和未签名操作提供单独的指令和逻辑。
为了证明,您实际上只需要了解那些对整数的操作(* +-)都可以工作在mod 2 ^ 32上。当您将负整数解释为无符号值时,您为其分配的无符号值等于有符号值+ 2 ^ 32。值mod 2 ^ 32完全相同。