if (base == 0) {
return 0;
}
- int64_t result = 1;
- int64_t pow = base;
+ uint64_t result = 1;
+ uint64_t pow = base;
- while (exponent > 0) {
- if ((exponent & 1) == 1) {
+ UBool safe = TRUE;
+ while (exponent > 0) {
+ U_ASSERT(safe);
+ if ((exponent & 1) == 1) {
result *= pow;
}
- pow *= pow;
+ if (pow >= 0x100000000L) {
+ // The next step will push us out of bounds
+ safe = FALSE;
+ } else {
+ pow *= pow;
+ }
exponent >>= 1;
}
return result;