C 输出基本数据类型的取值范围(exercise 2-1)
编写一个程序确定各种变量类型的取值范围包括有符号signed和无符号unsigned的 char 字符型, short 短整型, int 整型, long 长整型。可通过标准的头文件打印出相应的值,也可以直接计算。如果你想计算出浮点型变量的取值范围,难!!!
通过标准头文件输出
#include <stdio.h>
#include <limits.h>
/* 通过标准的头文件输出 */
int main(void)
{
printf("char(min, max): %d, %d\n", CHAR_MIN, CHAR_MAX);
printf("short(min, max): %d, %d\n", SHRT_MIN, SHRT_MAX);
printf("int(min, max): %d, %d\n", INT_MIN, INT_MAX);
printf("long(min, max): %ld, %ld\n", LONG_MAX, LONG_MIN);
/* unsigned */
printf("unsigned char: %u\n", UCHAR_MAX);
printf("unsigned short: %u\n", USHRT_MAX);
printf("unsigned int: %u\n", UINT_MAX);
printf("unsigned long: %lu\n", ULONG_MAX);
return 0;
}
通过计算输出
这个对我来说就很难了,丝毫没有头绪,只能面向谷歌开发。我找了一个我能看的懂得解法,这个题目的英文解法网站 Copyright © 2016, Senthil Kumaran
。我翻译和解释下。
#include <stdio.h>
/* 实现逻辑是这样的:
~0 取反操作将所有位都变成 1
(~0 will give bits in 1s.)
(unsigned <type>) 将其转换为无符号类型(最大值出来啦)
((unsigned <type>) will cast it unsigned.)
>> 1 右移 1 位移除符号位
(>> 1 right shifts 1 bit to remove the sign bit.)
(<type>) 再次将其转换为所需要的类型
(<type>) casting it the required type again */
int main(void)
{
/* 如 char 字符型 (unsigned char)~0 >> 1 = 127
-(char)((unsigned char)~0 >> 1) - 1 = -127 - 1 = -128*/
printf("char(min, max): %d, %d\n", -(char)((unsigned char)~0 >> 1) - 1,
(char)((unsigned char)~0 >> 1));
printf("short(min, max): %d, %d\n", -(short)((unsigned short)~0 >> 1) - 1,
(short)((unsigned short)~0 >> 1));
printf("int(min, max): %d, %d\n", -(int)((unsigned int)~0 >> 1) - 1,
(int)((unsigned int)~0 >> 1));
printf("long(min, max): %ld, %ld\n", -(long)((unsigned long)~0 >> 1) - 1,
(long)((unsigned long)~0 >> 1));
/* unsigned */
printf("unsigned char: %u\n", (unsigned char)~0);
printf("unsigned short: %u\n", (unsigned short)~0);
printf("unsigned int: %u\n", (unsigned int)~0);
printf("unsigned long: %lu\n", (unsigned long)~0);
return 0;
}