C-Determine the range of char, short, int, long, long long, float and double

Share a big cow's artificial intelligence tutorial. Zero-based! Easy to understand! Funny and humorous! Hope you join the artificial intelligence team too! Please click http://www.captainbed.net

/*
 * Range.c - by FreeMan
 */

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

float GetFloat(char sign, unsigned char exp, unsigned mantissa);
double GetDouble(char sign, unsigned short exp, unsigned long long mantissa);

int main(void)
{
	printf("Signed char [%d to %d]\n", 
		~((unsigned char)~0 >> 1), (unsigned char)~0 >> 1);
	printf("Unsigned char [0 to %u]\n", (unsigned char)~0);

	printf("Signed short [%d to %d]\n", 
		~((unsigned short)~0 >> 1), (unsigned short)~0 >> 1);
	printf("Unsigned short [0 to %u]\n", (unsigned short)~0);

	printf("Signed int [%d to %d]\n", ~(~0U >> 1), ~0U >> 1);
	printf("Unsigned int [0 to %u]\n", ~0U);

	printf("Signed long [%ld to %ld]\n", ~(~0UL >> 1), ~0UL >> 1);
	printf("Unsigned long [0 to %lu]\n", ~0UL);

	printf("Signed long long [%lld to %lld]\n", ~(~0ULL >> 1), ~0ULL >> 1);
	printf("Unsigned long long [0 to %llu]\n", ~0ULL);

	printf("Float [%g to %g]\n", GetFloat(1, 0, 1), GetFloat(0, ~0 - 1, ~0));

	printf("Double [%g to %g]\n", GetDouble(1, 0, 1), GetDouble(0, ~0 - 1, ~0));

	return 0;
}

float GetFloat(char sign, unsigned char exp, unsigned mantissa)
{
	unsigned f = (unsigned)(sign != 0) << 31 | (unsigned)exp << 23 
		| mantissa & 0x7FFFFF;
	return *((float *)&f);
}

double GetDouble(char sign, unsigned short exp, unsigned long long mantissa)
{
	unsigned long long d = (unsigned long long)(sign != 0) << 63 
		| (unsigned long long)(exp & 0x7FF) << 52 | mantissa & 0xFFFFFFFFFFFFF;
	return *((double *)&d);
}

// Output:
/*
Signed char [-128 to 127]
Unsigned char [0 to 255]
Signed short [-32768 to 32767]
Unsigned short [0 to 65535]
Signed int [-2147483648 to 2147483647]
Unsigned int [0 to 4294967295]
Signed long [-2147483648 to 2147483647]
Unsigned long [0 to 4294967295]
Signed long long [-9223372036854775808 to 9223372036854775807]
Unsigned long long [0 to 18446744073709551615]
Float [-1.4013e-45 to 3.40282e+38]
Double [-4.94066e-324 to 1.79769e+308]

*/

 

Guess you like

Origin blog.csdn.net/chimomo/article/details/111934436