假设我有两个size_t
变量,我需要将它们相乘,并将结果作为size_t
返回。
size_t first = ...;
size_t second = ...;
size_t result = first * second;
它们可能会溢出,所以我需要进行检查。
“规范”方式是先通过除法检查是否可以进行乘法:
if( second != 0 && first > ((size_t)-1) / second ) {
//handle overflow
}
//proceed with computing first * second
看似不太“干净”的方法是先乘法,然后再用除法检查结果:
size_t result = first * second;
if( second != 0 && result / second != first )
//handle overflow
}
然而,由于无符号数的乘法会通过环绕0来“安全地溢出”,因此这个方法可以正常工作,并且看起来与前面的代码(先检查再相乘)等价。
第二个代码有潜在的问题吗?它是否始终和第一个代码一样好?
-1
会始终转换为最大无符号值。 - Shafik Yaghmour