Summary: Need to be more explicit about types; it was trying to add types deduced to be `unsigned long` + `long` which didn't agree and could be an overflow. Be explicit anyway about the types involved. Appease Clang, and also make the code more obvious to the reader.
Test Plan: Tried with gcc 4.9, clang 3.5, clang 3.6.
Reviewed By: yfeldblum@fb.com
Subscribers: mathieubaudet, maoy, folly-diffs@, yzhan, yfeldblum, chalfant
FB internal diff:
D2134814
Tasks:
7337462
Signature: t1:
2134814:
1433726862:
5dd80b198187c610f793e26160919922863a22a2
Blame Revision:
D1934777
// approximate log_10(v) == log_10(2) * bits.
// Integer magic below: 77/256 is appx. 0.3010 (log_10(2)).
// The +1 is to make this the ceiling of the log_10 estimate.
- const auto minLength = 1 + ((bits * 77) >> 8);
+ const uint32_t minLength = 1 + ((bits * 77) >> 8);
// return that log_10 lower bound, plus adjust if input >= 10^(that bound)
// in case there's a small error and we misjudged length.
- return minLength +
- (UNLIKELY (v >= powersOf10[minLength]));
+ return minLength + (uint32_t) (UNLIKELY (v >= powersOf10[minLength]));
#else