我想知道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
?我们知道 int
就是一个 int
,它可以包含相同的内容并遵循相同的规则,但有更多的位。
考虑一下 char
与 short
(在 32 位系统上)。
unsigned char cmax = 0xFF; // 1111 1111(2) = 255(10)
unsigned short imax = 0xFFFF; // 1111 1111 1111 1111(2) = 65535(10)
如果我向其中任何一个添加 1,它们就会溢出,其中一个的大小是另一个的两倍。我是否需要做一些特殊的事情来检查一种情况与另一种情况下的溢出情况?没有。
您的示例有所不同,因为它当然是两个 int
,但推理是相同的。
关于C算术溢出32位和64位之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13251337/