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

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可以包含的最大值,并且它有效...

我虽然问题可能是由于ifwhile语句内部的比较引起的,因此类型转换却没有帮助......

是什么原因引起了这个?提前致谢!

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

Ant*_*ala 5

您不能使用这样的计算来推导有符号整数的范围,因为有符号整数溢出具有未定义的行为,并且最好使转换变窄导致实现定义的值或引发的信号.正确的解决方法就是使用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)