Advertisement
Guest User

Untitled

a guest
Jul 21st, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.42 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, long long inc) {
  8.     CHECK_TYPE sum = (CHECK_TYPE)((long long)number + inc);
  9.     if (inc > 0 && sum <= number)  /* incrementing does not increase value */
  10.         return 1;
  11.     if (inc < 0 && sum >= number)  /* decrementing does not decrease value */
  12.         return 1;
  13.     return 0;
  14. }
  15.  
  16. CHECK_TYPE find_limit(long long inc) {
  17.     CHECK_TYPE number;
  18.     for (number = 0;
  19.          !overflowed(number, inc);
  20.          number = (CHECK_TYPE)((long long)number + inc),
  21.          inc += (long long)number / 4);
  22.     /* now (number + inc) gives overflow of checked type */
  23.     for ( ;inc > 1 || inc < -1; ) {
  24.         if (overflowed(number, inc/2))
  25.             inc = inc/2;
  26.         else
  27.             number = (CHECK_TYPE)((long long)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