home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Professional / OS2PRO194.ISO / os2 / prgramer / unix / emx / test / longlong.c < prev    next >
C/C++ Source or Header  |  1993-01-02  |  3KB  |  137 lines

  1. /* longlong.c (emx+gcc) */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5.  
  6. #define GCC_2_2
  7. #define PRINTF
  8.  
  9. static double pii = 3141592653589793238.0;
  10. static double volatile d;
  11. static unsigned long long volatile ull;
  12.  
  13. int main (void);
  14. static long long input (const char *s);
  15. static void print_ll (long long x);
  16. #if !defined (PRINTF)
  17. static void decimal_ll (long long x);
  18. #endif
  19.  
  20.  
  21. static long long input (const char *s)
  22. {
  23.   char buf[256];
  24.  
  25.   printf ("%s", s);
  26.   fflush (stdout);
  27.   if (fgets (buf, sizeof (buf), stdin) == NULL)
  28.     exit (0);
  29.   return (_atoll (buf));
  30. }
  31.  
  32. #if !defined (PRINTF)
  33.  
  34. static void decimal_ll (long long x)
  35. {
  36.   long long d;
  37.   int i, j, z, n;
  38.  
  39.   z = 0;
  40.   for (i = 18; i >= 0; --i)
  41.     {
  42.       d = 1;
  43.       for (j = 0; j < i; ++j)
  44.         d *= 10;
  45.       n = 0;
  46.       while (d <= x)
  47.         {
  48.           ++n;
  49.           x -= d;
  50.         }
  51.       if (z || n != 0 || i == 0)
  52.         {
  53.           z = 1;
  54.           printf ("%d", n);
  55.         }
  56.     }
  57. }
  58.  
  59. #endif
  60.  
  61.  
  62. static void print_ll (long long x)
  63. {
  64.   unsigned long hi, lo;
  65.  
  66. #if defined (PRINTF)
  67.   printf ("%Ld %Lu", x, x);
  68. #else
  69.   if (x >= 0)
  70.     decimal_ll (x);
  71.   else
  72.     {
  73.       printf ("-");
  74.       decimal_ll (-x);
  75.     }
  76. #endif
  77.   printf (" (0x");
  78.   hi = (unsigned long)(x >> 32);
  79.   lo = (unsigned long)x;
  80.   if (hi != 0)
  81.     printf ("%lx%.8lx", hi, lo);
  82.   else
  83.     printf ("%lx", lo);
  84.   printf (")\n");
  85. }
  86.  
  87.  
  88.  
  89. int main (void)
  90. {
  91.   long long x, y;
  92.  
  93. #if defined (GCC_2_2)
  94.   print_ll ((long long)pii);
  95.   ull = (unsigned long long)pii;
  96.   print_ll ((long long)ull);
  97.   pii *= 3.0;
  98.   print_ll ((long long)pii);
  99.   ull = (unsigned long long)pii;
  100.   print_ll ((long long)ull);
  101. #endif
  102.   for (;;)
  103.     {
  104.       x = input ("x: ");
  105.       y = input ("y: ");
  106.       printf ("x=   "); print_ll (x);
  107.       printf ("y=   "); print_ll (y);
  108.       printf ("x+y= "); print_ll (x + y);
  109.       printf ("x-y= "); print_ll (x - y);
  110.       printf ("x*y= "); print_ll (x * y);
  111.       printf ("x/y= "); print_ll (x / y);
  112.       printf ("x%%y= "); print_ll (x % y);
  113.       printf ("-x=  "); print_ll (-x);
  114.       printf ("x|y= "); print_ll (x | y);
  115.       printf ("x&y= "); print_ll (x & y);
  116.       printf ("x^y= "); print_ll (x ^ y);
  117. #if defined (GCC_2_2)
  118.       printf ("x<<y="); print_ll (x << y);
  119.       printf ("x>>y="); print_ll (x >> y);
  120. #endif
  121.       printf ("~x=  "); print_ll (~x);
  122.       printf ("x<y= %d\n", x < y);
  123. #if defined (GCC_2_2)
  124.       printf ("x=   %g (signed)\n", (double)x);
  125.       ull = (unsigned long long)x;
  126.       printf ("x=   %g (unsigned)\n", (double)ull);
  127.       d = (double)x;
  128.       printf ("x(s)="); print_ll ((long long)d);
  129.       ull = (unsigned long long)x;
  130.       d = (double)ull;
  131.       ull = (unsigned long long)d;
  132.       printf ("x(u)="); print_ll ((long long)ull);
  133. #endif
  134.     }
  135.   return (0);
  136. }
  137.