Advertisement
Guest User

Untitled

a guest
Jul 21st, 2018
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.38 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. #ifndef CHECK_TYPE
  4. #  define CHECK_TYPE unsigned long
  5. #endif
  6.  
  7. int overflowed(CHECK_TYPE number, CHECK_TYPE inc, int sign) {
  8.     CHECK_TYPE sum = number + inc;
  9.     if (sign > 0 && sum <= number)  /* incrementing does not increase value */
  10.         return 1;
  11.     if (sign < 0 && sum >= number)  /* decrementing does not decrease value */
  12.         return 1;
  13.     return 0;
  14. }
  15.  
  16. CHECK_TYPE find_limit(int sign) {
  17.     CHECK_TYPE number, inc = sign;
  18.     for (number = 0;
  19.          !overflowed(number, inc, sign);
  20.          number += inc,
  21.          inc += number / 4);
  22.     /* now (number + inc) gives overflow of checked type */
  23.     for ( ; (sign > 0 && inc > 1) || (sign < 0 && inc < -1); ) {
  24.         if (overflowed(number, inc/2, sign))
  25.             inc = inc/2;
  26.         else
  27.             number += inc/2;
  28.     }
  29.     return number;
  30. }
  31.  
  32. int main() {
  33.     int size = sizeof(CHECK_TYPE);
  34.     printf("Size of type: %d byte(s)\n", size);
  35.     printf("Supposed upper limit: %llu (signed) or %llu (unsigned)\n",
  36.            (1LL << (size * 8 - 1)) - 1LL, (1LL << (size * 8 - 1))*2LL - 1LL);
  37.     printf("Supposed lower limit: %lld (signed) or %lld (unsigned)\n",
  38.            -(1LL << (size * 8 - 1)), 0LL);
  39.     printf("Calculated upper limit: %llu\n", (unsigned long long)find_limit(1));
  40.     printf("Calculated lower limit: %lld\n", (long long)find_limit(-1));
  41.     return 0;
  42. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement