exc/k&r/02-types-operators-and-exp/02-01.c

86 lines
2.0 KiB
C

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <limits.h>
#include <float.h>
#define BREAK_W 80
#define INDENT "\t"
#define PRINT_BITS(T, BITS) \
printf(#T"\n"); \
printf(INDENT"bits : %d\n", BITS)
#define PRINT_LIMS(T, F, BITS, MIN, MAX, UMAX) \
PRINT_BITS(T, BITS); \
printf(INDENT"signed : %"#F"d %"#F"d\n", MIN, MAX); \
printf(INDENT"unsigned : %"#F"u\n\n", UMAX)
#define PRINT_FLIMS(T, F, BITS, MIN, MAX) \
PRINT_BITS(T, BITS); \
printf(INDENT"min : %.0"#F"f\n", MIN); \
printf(INDENT"max : %.0"#F"f\n\n", MAX)
#define LIMITS(T, F) \
T T##lim; \
unsigned T u##T##lim = 0; \
b = 1; \
for (T##lim = 1; T##lim > 0; T##lim *= 2) ++b; \
PRINT_LIMS(T, F, b, T##lim--, T##lim, --u##T##lim)
#define FLIMITS(T, F) \
T T##max; \
T T##min; \
b = 2; \
for (T##max = 1; !isinf(T##max * 2); T##max *= 2) ++b; \
for (T##min = -1; !isinf(T##min * 2); T##min *= 2) ++b; \
PRINT_FLIMS(T, F, b, T##min, T##max)
#define HLIMITS(T, F) \
int T##bits = ceil(log2(U##T##_MAX)); \
PRINT_LIMS(T, F, T##bits, T##_MIN, T##_MAX, U##T##_MAX)
#define HFLIMITS(T, F) \
int T##bits = ceil(log2(T##_MAX)) * 2; \
PRINT_FLIMS(T, F, T##bits, T##_MIN, T##_MAX)
void print_break(char s[]);
/* print type size information, first by computation, then from headers */
int main()
{
int b;
print_break("By Computation");
LIMITS(char, );
LIMITS(short, );
LIMITS(int, );
LIMITS(long, l);
FLIMITS(float, );
FLIMITS(double, l);
print_break("From Headers");
HLIMITS(CHAR, );
HLIMITS(SHRT, );
HLIMITS(INT, );
HLIMITS(LONG, l);
HFLIMITS(FLT, );
HFLIMITS(DBL, l);
}
/* print string 's' padded with '-' on both sides to width 'BREAK_W' */
void print_break(char s[])
{
int i, len = BREAK_W - strlen(s) - 2;
for (i = 0; i < len; i += 2)
putchar('-');
printf(" %s ", s);
for (i = 1; i < len; i += 2)
putchar('-');
putchar('\n');
}