Advertisement
Guest User

Untitled

a guest
Jul 21st, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.53 KB | None | 0 0
  1. limits.c:
  2. #include <stdio.h>
  3.  
  4. #ifndef CHECK_TYPE
  5. # define CHECK_TYPE unsigned long
  6. #endif
  7.  
  8. int overflowed(CHECK_TYPE number, long long inc) {
  9. CHECK_TYPE sum = (CHECK_TYPE)((long long)number + inc);
  10. if (inc > 0 && sum <= number) /* incrementing does not increase value */
  11. return 1;
  12. if (inc < 0 && sum >= number) /* decrementing does not decrease value */
  13. return 1;
  14. return 0;
  15. }
  16.  
  17. CHECK_TYPE find_limit(long long inc) {
  18. CHECK_TYPE number;
  19. for (number = 0;
  20. !overflowed(number, inc);
  21. number = (CHECK_TYPE)((long long)number + inc),
  22. inc += (long long)number / 4);
  23. /* now (number + inc) gives overflow of checked type */
  24. for ( ;inc > 1 || inc < -1; ) {
  25. if (overflowed(number, inc/2))
  26. inc = inc/2;
  27. else
  28. number = (CHECK_TYPE)((long long)number + inc/2);
  29. }
  30. return number;
  31. }
  32.  
  33. int main() {
  34. int size = sizeof(CHECK_TYPE);
  35. printf("Size of type: %d byte(s)\n", size);
  36. printf("Supposed upper limit: %llu (signed) or %llu (unsigned)\n",
  37. (1LL << (size * 8 - 1)) - 1LL, (1LL << (size * 8 - 1))*2LL - 1LL);
  38. printf("Supposed lower limit: %lld (signed) or %lld (unsigned)\n",
  39. -(1LL << (size * 8 - 1)), 0LL);
  40. printf("Calculated upper limit: %llu\n", (unsigned long long)find_limit(1));
  41. printf("Calculated lower limit: %lld\n", (long long)find_limit(-1));
  42. return 0;
  43. }
  44.  
  45. limits.sh:
  46. #!/bin/bash
  47.  
  48. qualifiers=( "" "signed" "unsigned" )
  49. types=( "char" "short" "int" "long" "long long" )
  50.  
  51. for type in "${types[@]}"
  52. do
  53. for qualifier in "${qualifiers[@]}"
  54. do
  55. echo "**** check <$qualifier $type>"
  56. gcc -D"CHECK_TYPE=$qualifier $type" limits.c -o limits
  57. ./limits
  58. done
  59. done
  60.  
  61. ./limits.sh > limits.out
  62. limits.out:
  63. **** check < char>
  64. Size of type: 1 byte(s)
  65. Supposed upper limit: 127 (signed) or 255 (unsigned)
  66. Supposed lower limit: -128 (signed) or 0 (unsigned)
  67. Calculated upper limit: 127
  68. Calculated lower limit: -128
  69. **** check <signed char>
  70. Size of type: 1 byte(s)
  71. Supposed upper limit: 127 (signed) or 255 (unsigned)
  72. Supposed lower limit: -128 (signed) or 0 (unsigned)
  73. Calculated upper limit: 127
  74. Calculated lower limit: -128
  75. **** check <unsigned char>
  76. Size of type: 1 byte(s)
  77. Supposed upper limit: 127 (signed) or 255 (unsigned)
  78. Supposed lower limit: -128 (signed) or 0 (unsigned)
  79. Calculated upper limit: 255
  80. Calculated lower limit: 0
  81. **** check < short>
  82. Size of type: 2 byte(s)
  83. Supposed upper limit: 32767 (signed) or 65535 (unsigned)
  84. Supposed lower limit: -32768 (signed) or 0 (unsigned)
  85. Calculated upper limit: 32767
  86. Calculated lower limit: -32768
  87. **** check <signed short>
  88. Size of type: 2 byte(s)
  89. Supposed upper limit: 32767 (signed) or 65535 (unsigned)
  90. Supposed lower limit: -32768 (signed) or 0 (unsigned)
  91. Calculated upper limit: 32767
  92. Calculated lower limit: -32768
  93. **** check <unsigned short>
  94. Size of type: 2 byte(s)
  95. Supposed upper limit: 32767 (signed) or 65535 (unsigned)
  96. Supposed lower limit: -32768 (signed) or 0 (unsigned)
  97. Calculated upper limit: 65535
  98. Calculated lower limit: 0
  99. **** check < int>
  100. Size of type: 4 byte(s)
  101. Supposed upper limit: 2147483647 (signed) or 4294967295 (unsigned)
  102. Supposed lower limit: -2147483648 (signed) or 0 (unsigned)
  103. Calculated upper limit: 2147483647
  104. Calculated lower limit: -2147483648
  105. **** check <signed int>
  106. Size of type: 4 byte(s)
  107. Supposed upper limit: 2147483647 (signed) or 4294967295 (unsigned)
  108. Supposed lower limit: -2147483648 (signed) or 0 (unsigned)
  109. Calculated upper limit: 2147483647
  110. Calculated lower limit: -2147483648
  111. **** check <unsigned int>
  112. Size of type: 4 byte(s)
  113. Supposed upper limit: 2147483647 (signed) or 4294967295 (unsigned)
  114. Supposed lower limit: -2147483648 (signed) or 0 (unsigned)
  115. Calculated upper limit: 4294967295
  116. Calculated lower limit: 0
  117. **** check < long>
  118. Size of type: 8 byte(s)
  119. Supposed upper limit: 9223372036854775807 (signed) or 18446744073709551615 (unsigned)
  120. Supposed lower limit: -9223372036854775808 (signed) or 0 (unsigned)
  121. Calculated upper limit: 9223372036854775807
  122. Calculated lower limit: -9223372036854775808
  123. **** check <signed long>
  124. Size of type: 8 byte(s)
  125. Supposed upper limit: 9223372036854775807 (signed) or 18446744073709551615 (unsigned)
  126. Supposed lower limit: -9223372036854775808 (signed) or 0 (unsigned)
  127. Calculated upper limit: 9223372036854775807
  128. Calculated lower limit: -9223372036854775808
  129. **** check <unsigned long>
  130. Size of type: 8 byte(s)
  131. Supposed upper limit: 9223372036854775807 (signed) or 18446744073709551615 (unsigned)
  132. Supposed lower limit: -9223372036854775808 (signed) or 0 (unsigned)
  133. Calculated upper limit: 18446744073709551615
  134. Calculated lower limit: 0
  135. **** check < long long>
  136. Size of type: 8 byte(s)
  137. Supposed upper limit: 9223372036854775807 (signed) or 18446744073709551615 (unsigned)
  138. Supposed lower limit: -9223372036854775808 (signed) or 0 (unsigned)
  139. Calculated upper limit: 9223372036854775807
  140. Calculated lower limit: -9223372036854775808
  141. **** check <signed long long>
  142. Size of type: 8 byte(s)
  143. Supposed upper limit: 9223372036854775807 (signed) or 18446744073709551615 (unsigned)
  144. Supposed lower limit: -9223372036854775808 (signed) or 0 (unsigned)
  145. Calculated upper limit: 9223372036854775807
  146. Calculated lower limit: -9223372036854775808
  147. **** check <unsigned long long>
  148. Size of type: 8 byte(s)
  149. Supposed upper limit: 9223372036854775807 (signed) or 18446744073709551615 (unsigned)
  150. Supposed lower limit: -9223372036854775808 (signed) or 0 (unsigned)
  151. Calculated upper limit: 18446744073709551615
  152. Calculated lower limit: 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement