如何在c中找到所有数据类型的限制

时间:2014-05-05 05:05:23

标签: c types

我们都知道我们在c中使用的所有数据类型都有像

这样的修复限制
char range from -128 to 127
integer store value from -2147483648 to 2147483647

像这样都有修复限制。

我的问题很简单,如果我们使用头文件,我们可以很容易地找出所有数据类型的范围。但是有没有任何过程或逻辑可以通过它我们找到所有这些数据类型的限制而不使用任何预定义的函数或头文件或宏?

如果有任何请解决我的问题

我也想知道头文件。是否有任何方法可以改变float中的小数点后的数字?

4 个答案:

答案 0 :(得分:1)

头文件存在是有原因的,对于有符号整数类型,允许范围取决于否则不可观察的类型的属性。 (对于无符号类型,它很简单,顺便说一句,最小值始终为0,最大值为-1的转换值。

签名类型取决于

  • 类型的宽度,即字节大小乘以类型中的位数CHAR_BIT
  • 最终存在填充位
  • 类型的符号表示,因为它们可以为类型
  • 实现不同的最小值

答案 1 :(得分:1)

我对C很新,但我注意到如果你减少无符号类型,它将被赋予最大值。

我已将limits.h仅用于比较结果。

#include <stdio.h>
#include <limits.h>

int main(void)
{   
    unsigned char c;
    unsigned short s;
    unsigned int i;
    unsigned long l;

    // char
    printf("UCHAR_MAX  = %u\n",  UCHAR_MAX);
    printf("UCHAR_MAX  = %u\n", --c);

    // short
    printf("USHRT_MAX  = %u\n",  USHRT_MAX);
    printf("USHRT_MAX  = %u\n",  --s);

    // int
    printf("UINT_MAX   = %u\n",  UINT_MAX);
    printf("UINT_MAX   = %u\n",  --i);

    // long
    printf("ULONG_MAX  = %lu\n",  ULONG_MAX);
    printf("ULONG_MAX  = %lu\n",  --l);
}   

结果:

UCHAR_MAX  = 255
UCHAR_MAX  = 255
USHRT_MAX  = 65535
USHRT_MAX  = 65535
UINT_MAX   = 4294967295
UINT_MAX   = 4294967295
ULONG_MAX  = 18446744073709551615
ULONG_MAX  = 140731079060271

你可以看到它适用于所有人,除了很长,至于为什么......也许比我更有经验的人可以解释。

答案 2 :(得分:0)

你的问题是有道理的。

考虑第二个断言问题:

integer store value from -2147483648 to 2147483647

仅在32位系统上才是这样。在16位系统上,整数可以存储-32768到32767范围内的值。

正如您在问题中指出的那样,大多数程序员依赖于头文件(如limit.h)来确定数据类型的范围。

计算整数限制的一种方法是使用&#39; sizeof({type})x 8&#39;确定可用的位数。然后,当然,减去一位以便签名&#39;允许2的补码符号位的整数类型。

虽然这种方法可以很好地整合;它是非整数类型的边缘,例如float / double等。

答案 3 :(得分:-1)

数据类型的范围取决于它具有多少位。

例如,char存储在1个字节(= 8位)上,它给出范围(-2 ^ 7) - (2 ^ 7-1)。

所以签名数据类型的公式是:

2^(((sizeof(t)-1) * 8) to 2^((sizeof(t)-1) * 8) - 1.

对于无符号数据类型,它是:

0 to 2^((sizeof(t)) * 8) - 1.

其中t是数据类型。 它乘以8,因为sizeof以字节为单位返回大小。

此公式不适用于浮点类型,因为它们的存储方式不同。您可以查看this questionthis wiki page以便更好地了解这一点。我从来没有需要使用接近极限的数字并使其跨平台运行,所以限制对我来说总是一个恒定的值。