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

我们都知道我们在c中使用的所有数据类型都有固定限制

char range from -128 to 127 integer store value from -2147483648 to 2147483647 

像这样都有修复限制。

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

如果有的请解决我的问题

我也想知道头文件。 是否有任何方法可以改变浮点数十进制后的数字?

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

签名类型取决于

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

你的问题是有道理的。

考虑第二个断言问题:

 integer store value from -2147483648 to 2147483647 

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

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

计算整数限制的一种方法是使用’sizeof({type})x 8’来确定可用的位数。 然后,当然,为“有符号”整数类型减去一位,允许2的补码符号位。

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

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

我已经包含limits.h只是为了比较结果。

 #include  #include  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 

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

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

例如,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以字节为单位返回大小。

此公式不适用于浮点类型,因为它们的存储方式不同。 你可以看看这个问题或这个维基页面,以便更好地理解它。 我从来不需要处理接近极限的数字并使其跨平台运行,因此限制对我来说总是一个恒定的值。