fork download
  1. #include<stdio.h>
  2.  
  3. // unsigned int、桁あふれの判定
  4. // (unsigned int のサイズは不問)
  5. int isOverflow_uint(unsigned int x, unsigned int y)
  6. {
  7. #define UI8H (sizeof(unsigned int) * 8 / 2)
  8. return
  9. (1 << UI8H)
  10. &
  11. (
  12. ((x >> UI8H) + (y >> UI8H))
  13. +
  14. (
  15. (
  16. (
  17. (x & ((unsigned int)~0 >> UI8H))
  18. +
  19. (y & ((unsigned int)~0 >> UI8H))
  20. )
  21. &
  22. (1 << UI8H)
  23. ) ? 1 : 0
  24. )
  25. );
  26. }
  27.  
  28. int main()
  29. {
  30. unsigned int a, b;
  31.  
  32. a = 0xFFFFfffe; // 32bitだとして…
  33. b = 0x00000001;
  34. printf("0x%08X + 0x%08X ~ 桁あふれ %s\n", a, b, isOverflow_uint(a, b) ? "する" : "しない");
  35.  
  36. a = 0xFFFFfffe;
  37. b = 0x00000002;
  38. printf("0x%08X + 0x%08X ~ 桁あふれ %s\n", a, b, isOverflow_uint(a, b) ? "する" : "しない");
  39.  
  40. return 0;
  41. }
Success #stdin #stdout 0s 1832KB
stdin
Standard input is empty
stdout
0xFFFFFFFE + 0x00000001 ~ 桁あふれ しない
0xFFFFFFFE + 0x00000002 ~ 桁あふれ する