我正在做 K&R 的练习 2-1,目标是计算不同变量类型的范围,下面是我计算最大值 a 的函数short int
可以包含:
short int max_short(void) {
short int i = 1, j = 0, k = 0;
while (i > k) {
k = i;
if (((short int)2 * i) > (short int)0)
i *= 2;
else {
j = i;
while (i + j <= (short int)0)
j /= 2;
i += j;
}
}
return i;
}
我的问题是这个函数的返回值是:-32768
这显然是错误的,因为我期待一个正值。我不知道问题出在哪里,我使用相同的函数(变量类型发生变化)来计算 int 可以包含的最大值并且它有效......
我认为问题可能是由内部比较引起的if
and while
语句,因此进行类型转换,但这没有帮助......
有什么想法造成这种情况吗?提前致谢!
EDIT:感谢 Antti Haapala 的解释,符号位溢出会导致未定义的行为,而不是负值。
您不能使用这样的计算来推断出范围有符号整数,因为有符号整数溢出未定义的行为,并且缩小转换最多会导致实现定义的值或发出信号。正确的解决方案是使用SHRT_MAX
, INT_MAX
... of <limits.h>
。推导出最大值有符号整数via算术是标准化 C 语言中的一道难题,自 1989 年第一个标准发布以来一直如此。
请注意,K&R 的原始版本早于 C 的标准化11年,甚至2nd一 - “ANSI-C”版本predates它们是为一种与当今的 C 语言几乎(但也不完全)完全不同的语言编写的。
不过,对于无符号整数,您可以轻松做到这一点:
unsigned int i = -1;
// i now holds the maximum value of `unsigned int`.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)