我正在研究 K&R 第二版,但无法弄清楚为什么我会得到某个结果。我要解决的问题是计算数据类型的上限和下限。具体来说:
“编写一个程序来确定 char 、 short 、 int 和 long 变量的范围,包括有符号和无符号,方法是从标准头文件中打印适当的值并通过直接计算。如果你计算它们更难:确定各种浮点数的范围-点类型。”
我已经了解了按位运算符和二进制的恭维,并且有一个我认为应该适用于有符号数据类型的解决方案,但它适用于无符号数据类型,这对我来说没有任何意义。这是代码:
#include <stdio.h>
main()
{
signed int i;
i = ~0;
i >>= 1;
printf("Upper limit: %d\n", i);
printf("Lower limit: %d\n", -i -1);
}
这将导致为上限打印 -1,为下限打印 0。但是,如果我将 i 更改为无符号整数,我会得到我期望的结果(2147483647 和 -2147483648)。我无法解决这个问题,因为我的理解是 unsigned int 永远不能小于 0,并且有符号 int 应该使用这些按位运算符工作,即,如果它是 32 位系统,
~0 == 11111111111111111111111111111111
, 和
~0 >> 1 == 011111111111111111111111111111111,
or 2147483647.
知道我哪里出错了吗?