gpt4 book ai didi

c - 在 C 中查找 short int 变量的最大值

转载 作者:太空狗 更新时间:2023-10-29 15:34:33 24 4
gpt4 key购买 nike

我正在做 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;
}

我的问题是此函数的返回值是:-32768 这显然是错误的,因为我期望的是正值。我不知道问题出在哪里,我使用了相同的函数(变量类型发生了变化)来计算一个 int 可以包含的最大值并且它起作用了......

虽然问题可能是由 ifwhile 语句内部的比较引起的,因此进行了类型转换,但这并没有帮助...

知道是什么原因造成的吗?提前致谢!

编辑:感谢 Antti Haapala 的解释,符号位溢出导致未定义的行为而不是负值。

最佳答案

您不能使用这样的计算来推断有符号整数的范围,因为有符号整数溢出具有未定义的行为,并且缩小转换最多只能导致实现-定义的值,或发出的信号。正确的解决方案是只使用 SHRT_MAX , INT_MAX ... 的 <limits.h> .通过算术推导有符号整数的最大值是标准化 C 语言中的一道难题,自 1989 年第一个标准发布以来一直如此。

请注意,K&R 的原始版本早于 C 的标准化11 年,甚至第 2 版本 - “ANSI-C”版本也早于 最终确定的标准并与它有所不同 - 它们是为一种语言编写的,这种语言与当今的 C 语言几乎不同,但也不完全不同。

不过,对于无符号整数,您可以轻松做到这一点:

unsigned int i = -1;
// i now holds the maximum value of `unsigned int`.

关于c - 在 C 中查找 short int 变量的最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45882317/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com