Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #ifndef CHECK_TYPE
- # define CHECK_TYPE unsigned long
- #endif
- int overflowed(CHECK_TYPE number, long long inc) {
- CHECK_TYPE sum = (CHECK_TYPE)((long long)number + inc);
- if (inc > 0 && sum <= number) /* incrementing does not increase value */
- return 1;
- if (inc < 0 && sum >= number) /* decrementing does not decrease value */
- return 1;
- return 0;
- }
- CHECK_TYPE find_limit(long long inc) {
- CHECK_TYPE number;
- for (number = 0;
- !overflowed(number, inc);
- number = (CHECK_TYPE)((long long)number + inc),
- inc += (long long)number / 4);
- /* now (number + inc) gives overflow of checked type */
- for ( ;inc > 1 || inc < -1; ) {
- if (overflowed(number, inc/2))
- inc = inc/2;
- else
- number = (CHECK_TYPE)((long long)number + inc/2);
- }
- return number;
- }
- int main() {
- int size = sizeof(CHECK_TYPE);
- printf("Size of type: %d byte(s)\n", size);
- printf("Supposed upper limit: %llu (signed) or %llu (unsigned)\n",
- (1LL << (size * 8 - 1)) - 1LL, (1LL << (size * 8 - 1))*2LL - 1LL);
- printf("Supposed lower limit: %lld (signed) or %lld (unsigned)\n",
- -(1LL << (size * 8 - 1)), 0LL);
- printf("Calculated upper limit: %llu\n", (unsigned long long)find_limit(1));
- printf("Calculated lower limit: %lld\n", (long long)find_limit(-1));
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement