我正在尝试运用K&R的2.1.练习内容如下:
写一个程序,以确定的范围
char,short,int,和long变量,都signed和unsigned通过打印从标准头合适的值,并通过直接计算.如果计算它们会更难:确定各种浮点类型的范围.
打印标准标题中常量的值很简单,就像这样(例如只显示整数):
printf("Integral Ranges (from constants)\n");
printf("int max: %d\n", INT_MAX);
printf("int min: %d\n", INT_MIN);
printf("unsigned int max: %u\n", UINT_MAX);
Run Code Online (Sandbox Code Playgroud)
但是,我想以编程方式确定限制.
我尝试了这个代码似乎应该可以工作,但它实际上进入一个无限循环并被卡在那里:
printf("Integral Ranges (determined programmatically)\n");
int i_max = 0;
while ((i_max + 1) > i_max) {
++i_max;
}
printf("int max: %d\n", i_max);
Run Code Online (Sandbox Code Playgroud)
为什么这会陷入循环?似乎当整数溢出时,它会从2147483647跳转到-2147483648.递增的值显然小于先前的值,因此循环应该结束,但它不会.
好的,我正准备发表评论,但它太长了......
你被允许使用sizeof吗?
如果为true,那么有一种简单的方法可以找到任何类型的最大值:
例如,我会找到一个整数的最大值:
定义:INT_MAX = (1 << 31) - 1对于32位整数(2 ^ 31 - 1)
如果我们使用整数来计算int max,那么先前的定义会溢出,因此,必须正确调整它:
INT_MAX = (1 << 31) - 1
= ((1 << 30) * 2) - 1
= ((1 << 30) - 1) * 2 + 2) - 1
= ((1 << 30) - 1) * 2) + 1
Run Code Online (Sandbox Code Playgroud)
并使用sizeof:
INT_MAX = ((1 << (sizeof(int)*8 - 2) - 1) * 2) + 1
Run Code Online (Sandbox Code Playgroud)
只需阅读每种类型的规则,您就可以对任何有符号/无符号类型执行相同操作.