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, CHECK_TYPE inc, int sign) {
- CHECK_TYPE sum = number + inc;
- if (sign > 0 && sum <= number) /* incrementing does not increase value */
- return 1;
- if (sign < 0 && sum >= number) /* decrementing does not decrease value */
- return 1;
- return 0;
- }
- CHECK_TYPE find_limit(int sign) {
- CHECK_TYPE number, inc = sign;
- for (number = 0;
- !overflowed(number, inc, sign);
- number += inc,
- inc += number / 4);
- /* now (number + inc) gives overflow of checked type */
- for ( ; (sign > 0 && inc > 1) || (sign < 0 && inc < -1); ) {
- if (overflowed(number, inc/2, sign))
- inc = inc/2;
- else
- 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