Ryu*_*kki 4 c size short typecase
我正在研究K&R的练习2-1,目标是计算不同变量类型的范围,下面是我计算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;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是这个函数返回的值是:-32768
这显然是错误的,因为我期待一个正值.我无法弄清楚问题出在哪里,我使用相同的函数(在变量类型中有变化)来计算int可以包含的最大值,并且它有效...
我虽然问题可能是由于if
和while
语句内部的比较引起的,因此类型转换却没有帮助......
是什么原因引起了这个?提前致谢!
编辑:感谢Antti Haapala的解释,符号位的溢出导致未定义的行为,而不是负值.
您不能使用这样的计算来推导有符号整数的范围,因为有符号整数溢出具有未定义的行为,并且最好使转换变窄导致实现定义的值或引发的信号.正确的解决方法就是使用SHRT_MAX
,INT_MAX
...的<limits.h>
.通过算术推导出有符号整数的最大值是标准化C语言中的一个棘手问题,自1989年第一个标准出版以来就一直如此.
请注意,K&R的原始版本比C的标准化提前了11年,甚至第二个版本 - "ANSI-C"版本早于最终标准并且与它有所不同 - 它们是针对一种几乎不是的语言编写的,但不完全,完全不同于今天的C语言.
您可以轻松地对无符号整数执行以下操作:
unsigned int i = -1;
// i now holds the maximum value of `unsigned int`.
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
922 次 |
最近记录: |