实验一:
#include<stdio.h>
#include<limits.h>
/*determine rangers of types*/
main()
{ /*signed types*/
printf("signed char min=%d/n",SCHAR_MIN);
printf("signed char max=%d/n",SCHAR_MAX);
printf("signed short min=%d/n",SHRT_MIN);
printf("signed short max=%d/n",SHRT_MAX);
printf("signed int min=%d/n",INT_MIN);
printf("signed int max=%d/n",INT_MAX);
printf("signed long min=%ld/n",LONG_MIN);
printf("signed long max=%ld/n",LONG_MAX);
/*unsigner types*/
printf("unsigned char max=%u/n",UCHAR_MAX);
printf("unsigned short max=%u/n",USHRT_MAX);
printf("unsigned int max=%u/n",UINT_MAX);
printf("unsigned long max=%lu/n",ULONG_MAX);
}
ANSI C标准规定:各种类型的取值范围必须在头文件<limits.h>中定义。Short、int、和long类型在不同的硬件上有不同的长度,所以它们在不同的机器上的取值范围也往往不同。
实验二:
#include<stdio.h>
/*determine rangers of types*/
main()
{ /*signed types*/
printf("signed char min=%d/n",-(char)((unsigned char) ~0>>1));
printf("signed char max=%d/n",(char)((unsigned char) ~0>>1));
printf("signed short min=%d/n",-(short)((unsigned short) ~0>>1));
printf("signed short max=%d/n",(short)((unsigned short) ~0>>1));
printf("signed int min=%d/n",-(int)((unsigned int) ~0>>1));
printf("signed int max=%d/n",(int)((unsigned int) ~0>>1));
printf("signed long min=%ld/n",-(long)((unsigned long) ~0>>1));
printf("signed long max=%ld/n",(long)((unsigned long) ~0>>1));
/*unsigner types*/
printf("unsigned char max=%u/n",(unsigned char) ~0);
printf("unsigned short max=%u/n",(unsigned short) ~0);
printf("unsigned int max=%u/n",(unsigned int) ~0);
printf("unsigned long max=%lu/n",(unsigned long) ~0);
}
按位运算符进行计算。表达式:(char)((unsigned char) ~0>>1
@先把数字0的各个二进制位全部转换为1: ~0
@将结果值转换为unsigned char类型:(unsigned char)~0
@再右移一位以清楚符号位:(unsigned char)~0 >> 1
@最后把它转换为char类型:(char)(unsigned char)~0 >> 1
这一系列的操作最终结果得到了signed类型字符的最大值。