我正在研究 K&R 第二版,但无法弄清楚为什么我会得到某个结果。我要解决的问题是计算数据类型的上限和下限。具体来说:
"Write a program to determine the ranges of char , short , int , and long variables, both signed and unsigned , by printing appropriate values from standard headers and by direct computation. Harder if you compute them: determine the ranges of the various floating-point types."
我了解了按位运算符和二进制补码,并且有一个我认为应该适用于有符号数据类型的解决方案,但它适用于对我来说没有任何意义的无符号数据类型。这是代码:
#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,并且 signed int 应该使用这些按位运算符工作,即,如果它是 32 位系统,
~0 == 11111111111111111111111111111111
和
~0 >> 1 == 011111111111111111111111111111111,
or 2147483647.
知道我哪里出错了吗?
最佳答案
通过使用 %d
,您将您的值视为signed
以继续 printf
。
您可以使用 %u
代替。
已添加
正如 Magn3s1um 所指出的,您不需要为您的特定任务 printf
指定 signed
和 unsigned
将为您完成所有工作。
关于在 C 中计算数据类型的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17796041/