如何以编程方式确定C中int数据的最大和最小限制?

Sam*_*ies 7 c

我正在尝试运用K&R的2.1.练习内容如下:

写一个程序,以确定的范围char,short,int,和long变量,都signedunsigned通过打印从标准头合适的值,并通过直接计算.如果计算它们会更难:确定各种浮点类型的范围.

打印标准标题中常量的值很简单,就像这样(例如只显示整数):

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.递增的值显然小于先前的值,因此循环应该结束,但它不会.

Jua*_*rez 7

好的,我正准备发表评论,但它太长了......

你被允许使用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)

只需阅读每种类型的规则,您就可以对任何有符号/无符号类型执行相同操作.