86 lines
2.0 KiB
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');
|
|
}
|