在 C 中计算数据类型的范围

标签 c

我正在研究 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 指定 signedunsigned将为您完成所有工作。

关于在 C 中计算数据类型的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17796041/

相关文章:

c - 在 int width == CHAR_BIT 的特殊情况下,fgetc 的输出是什么

c++ - rate++a,a++,a=a+1 和 a+=1 在 C 中的执行效率。假设 gcc 是编译器

c - Linux header 中的 TMPFS_MAGIC 和确定可用磁盘空间的错误

在运行时有条件地替换 C 函数

c - Win32 "C"未处理的异常在错误的位置中断

c - 理解C程序高斯约当消去法

c - 有没有办法检查空终止字节后的字符串内容?

c - 如何仅从 clang AST 获取函数声明?

c - 用 C 创建简单计算器时出现问题

计算C中给定大范围内的完全平方数