64位无符号溢出后差1的问题: UINT(-3) + UINT64(5) ) % UINT64(5) 竟然等于了3 (后续避免使用UINT 溢出效果)

运行系统:

window7 x64位操作系统,AMD CPU

 

编译环境;

vc90x64

 

在MFC中执行下面的语句:原语句是 (UINT(1) - UINT(4) + UINT64(5) ) % UINT64(5)

( UINT(-3) + UINT64(5) )  % UINT64(5)

得出的结果是:3         ( -3 + 5 )  % 5 竟然等于了3!!!

 

UINT(-3):                        0xFFFF FFFD

UINT64(-3):0xFFFF FFFF FFFF FFFD

UINT64(5):0x0000 0000 0000 0005

 

出现问题的原因是什么?进行了一些其它计算,结果如下:

(UINT(-3) + UINT(5)) % UINT64(5)   == 2

(UINT(-3) + UINT(5)) % UINT(5)        == 2

(INT(-3)    + UINT(5)) % UINT64(5)   == 2

UINT(-3) + UINT64(5)                          == 2

 

在大多数情况下 都会是正确的,问题原因还不清楚,但问题产生的条件清楚,为如下:

1. % 被余数 为 UINT(负数) + UINT64(整数),这个存在着负数转UINT,UINT与UINT64相加

2. %余数 为 UINT64 整数

 

当前未找到问题的真实原因,当前作为一个案例,避免使用到 UINT 负值的情况,避免使用UINT 溢出效果。

 

Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu  转载请标明来源 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(MFC,C++)