#include <stdio.h>
#include <limits.h>
#include <math.h>

int main(void) {
	short short_var = 0; 
	int int_var = 0, int_var_1 = 0;
	long long long_long_var = 0; 
	
	float float_var = 0.0; 
	double double_var = 0.0; 
	
	int mask = 0; 
	int one = 0x0001; 

	printf("Underlying sizes of the storage structures\n");
	printf("\tsize of short_var: %d\n", sizeof(short_var)); 
	printf("\tsize of int_var: %d\n", sizeof(int_var)); 
	printf("\tsize of long_long_var: %d\n", sizeof(long_long_var)); 
	printf("\tsize of float_var: %d\n", sizeof(float_var)); 
	printf("\tsize of double_var: %d\n\n", sizeof(double_var)); 
	
	printf("Range of values from limits.h and math.h\n"); 
	printf("\tUSHRT_MAX: %u\n", USHRT_MAX); 
	printf("\tSHRT_MAX: %d\n", SHRT_MAX);
	printf("\tSHRT_MIN: %d\n\n", SHRT_MIN);

	printf("\tUINT_MAX: %u\n", UINT_MAX); 
	printf("\tINT_MAX: %d\n", INT_MAX);
	printf("\tINT_MIN: %d\n\n", INT_MIN);

	printf("\tULLONG_MAX: %llu\n", ULLONG_MAX);
	printf("\tLLONG_MAX: %lld\n", LLONG_MAX);
	printf("\tLLONG_MIN: %lld\n\n", LLONG_MIN);

	printf("\tMAXFLOAT: %f\n\n", MAXFLOAT); 
	
	printf("Quick multiply for positive ints\n");
	int_var = 4; 
	printf("\tint_var = %d, left shift by 1 = %d\n", int_var, int_var << 1); 
	printf("\tint_var = %d, left shift by 3 = %d\n\n", int_var, int_var << 3); 

	printf("Quick divide for positive ints\n");
	int_var = 40; 
	printf("\tint_var = %d, right shift by 1 = %d\n\n", int_var, int_var >> 1); 

	printf("Using XOR with a mask to flip bits in an int\n");
	int_var = 2; 
	mask = 0xffffffff; 
	printf("\tint_var = %d, XOR with %x = %d\n\n", int_var, mask, int_var ^ mask); 
	
	int_var = 2; 
	mask = 0x7fffffff; 
	printf("\tint_var = %d, XOR with %x = %d\n\n", int_var, mask, int_var ^ mask); 
	
	printf("Using a mask to isolate the low order byte in a 4 byte word\n");
	int_var = 32769;
	mask = 0x000000ff; 
	printf("\tint_var = %d, AND with %x = %d\n\n", int_var, mask, int_var & mask); 
	
	printf("Converting a positive integer to a two's compliment negative\n");
	int_var = 8; 
	mask = 0xffffffff; 
	int_var_1 = int_var ^ mask; 
	printf("\tint_var = %d, XOR with %x = %d\n", int_var, mask, int_var_1); 
	printf("\tint_var_1 = %d, add %x = %d\n\n", int_var_1, one, int_var_1 + one); 
	
	printf("Back to positive\n"); 
	int_var = int_var_1 + one; 
	mask = 0xffffffff; 
	int_var_1 = int_var ^ mask; 
	printf("\tint_var = %d, XOR with %x = %d\n", int_var, mask, int_var_1); 
	printf("\tint_var_1 = %d, add %x = %d\n\n", int_var_1, one, int_var_1 + one); 

	printf("Wrapping (or not, as the case may be)\n");
	int_var = INT_MAX; 
	printf("\tint_var = %d, add 1 = %d\n\n", int_var, int_var + 1); 
	
	double_var = MAXFLOAT; 
	printf("\tdouble_var = %f, add 1.0 = %f\n\n", double_var, double_var + 1.0); 
	
	return(0); 
}
