我正在尝试 K&R 的练习 2.1。练习内容如下:
编写一个程序来确定范围char
, short
, int
, and long
变量,两者signed
and 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);
但是,我想以编程方式确定限制。
我尝试了这段代码,看起来应该可以工作,但实际上它进入了无限循环并卡在那里:
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);
为什么这会陷入循环?看起来,当整数溢出时,它会从 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
并使用sizeof
:
INT_MAX = ((1 << (sizeof(int)*8 - 2) - 1) * 2) + 1
您只需阅读每种类型的规则即可对任何有符号/无符号类型执行相同的操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)