How many bits and where they go.

fouts at AMES-NAS.ARPA fouts at AMES-NAS.ARPA
Sun Feb 16 12:42:27 AEST 1986


     Attached is a simple minded program which gives a printout of various
odd bits of information about the way a machine does arithmetic in C.

     It works on a number of unix implementations (I. E. gives the same
answers as the local C manual,) and I would be very interested in hearing
from anyone who tries it on other implementations.

     (So far, I've tried it on SVR2 and BSD4.2 Vaxen, SGI Irises, Amdahl
UTS, and Cray UniCos.)

     Compile in the usual way.

----- Cut here and compile.  THIS IS NOT A SHELL SCRIPT -----

#define checkbits(N,CP,L) { \
    N = 1; \
    L = 0; \
    while (N != 0) { \
	N <<= 1; \
	L++; \
    } \
    printf("%s   %4d   %6d    ", CP, L, sizeof(N)); \
    N = 1; \
    N = ~N; \
    switch (N) { \
        case -1 : printf("1's c.\n"); break; \
	case -2 : printf("2's c.\n"); break; \
	default : if (N < 0) { \
	    printf("  mag.\n"); \
	} else { \
	    printf("unsign\n"); \
	} \
    } \
}

#define printbytes(CP,N,L) { \
    long temp = (long) N; \
    printf("%s ",CP); \
    for (i = 0; i < ((L) / bits); i++) { \
        printf("%3d",(int) (temp & 0xFFL)); \
	temp >>= bits; \
    } \
    printf("\n"); \
}

char C;
short S;
int I;
long L;
int icl, isl, iil, ill;

union u {
    char C;
    short S;
    int I;
    long L;
    char FILLER[sizeof(L)];
} U;


main()
{
    int i;
    int bits;
    for (i = 0; i < sizeof(U.L); i++) U.FILLER[i] = (char) (i + 1);
    printf(" Type   Bits   Sizeof   Format\n");
    checkbits(C," Char",icl);
    bits = icl;
    checkbits(S,"Short",isl);
    checkbits(I,"  Int",iil);
    checkbits(L," Long",ill);
    printf("\nPosition ");
    for (i = 0; i < sizeof(U.L); i++) printf("%3d",i);
    printf("\n");
    printbytes("    Char",U.C,icl);
    printbytes("   Short",U.S,isl);
    printbytes("     Int",U.I,iil);
    printbytes("    Long",U.L,ill);
    printf("\n");
    if ( (char) U.S == U.S ) printf("Char == Short\n");
    if ( (short) U.I == U.I ) printf("Short == Int\n");
    if ( (long)((int) (U.L)) == U.L ) printf("Int == Long\n");
}



More information about the Comp.sources.unix mailing list