我想知道通过检查 32 位和 64 位的算术溢出是否有任何区别?(除了限制..)
例如对于 32 位乘法a * b
:
if(b > 0 && a > UINT32_MAX_VALUE / b) {
//Overflow
}
我可以对 64 位乘法使用相同的逻辑吗?喜欢:
if(b > 0 && a > UINT64_MAX_VALUE / b) {
//Overflow
}
当我必须检查有符号/无符号的 64 位溢出时,是否有任何陷阱?
为自己简化它。什么是 32 位int
和 64 位int
?我们知道 anint
是一个int
,它可以包含相同的东西并遵循相同的规则,但一个有更多的位。
考虑 achar
与 a short
(在 32 位系统上)。
unsigned char cmax = 0xFF; // 1111 1111(2) = 255(10)
unsigned short imax = 0xFFFF; // 1111 1111 1111 1111(2) = 65535(10)
如果我在其中任何一个上加 1,它们都会溢出,一个是另一个大小的两倍。在一种情况下与另一种情况下,我是否需要做任何特别的事情来检查溢出?不。
你的例子不同,因为它int
当然是两个,但推理是一样的。