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

如何在c中找到所有数据类型的限制,c,types,C,Types,我们都知道,我们在c中使用的所有数据类型都有固定的限制,比如 char range from -128 to 127 integer store value from -2147483648 to 2147483647 像这样的人都有固定的限制 我的问题很简单,如果我们使用头文件,我们可以很容易地找到所有数据类型的范围。但是,是否有任何流程或逻辑可以让我们在不使用任何预定义函数、头文件或宏的情况下找到所有这些数据类型的限制 如果有的话,请解决我的问题 我还想知道头文件。是否有任何方法可以改变浮

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

char range from -128 to 127
integer store value from -2147483648 to 2147483647
像这样的人都有固定的限制

我的问题很简单,如果我们使用头文件,我们可以很容易地找到所有数据类型的范围。但是,是否有任何流程或逻辑可以让我们在不使用任何预定义函数、头文件或宏的情况下找到所有这些数据类型的限制

如果有的话,请解决我的问题


我还想知道头文件。是否有任何方法可以改变浮点小数后的位数???

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

例如,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返回字节大小


此公式不适用于浮点类型,因为它们的存储方式不同。你可以看一看或者更好地理解这一点。我从来不需要处理接近极限的数字,并使其跨平台运行,因此极限对我来说始终是一个常量。

你的问题是有道理的

考虑到第二个断言,它是一个问题:

integer store value from -2147483648 to 2147483647
这仅在32位系统上是正确的。在16位系统上,整数可以存储-32768到32767范围内的值

正如您在问题中所指出的,大多数程序员依靠诸如limit.h之类的头文件来确定数据类型的范围

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


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

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

有符号类型取决于

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

我对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);
}   

正如你所看到的,它对所有人都有效,除了长时间,至于原因。。嗯,也许有比我更有经验的人可以解释。

听起来像是限制。hsizeof(char)=1*8=8(位)-->2^8=268-->限制:-1*256/2=-128和256/2-1=127。这就是你的意思吗?检查限制.h头文件你不想这样做是因为?其中的表示和限制由标准规则定义和约束。并非巧合的是,所述实现需要提供公开这些限制的类似标准授权表示<代码>限制。h就是出于这个原因而存在的。除了纯粹出于好奇,您是否有任何特殊原因不想使用标准授权提供的内容来促进您寻求获得的限制?只是好奇而已(希利,看这个)。不。您可以通过使用您试图避免的宏来找到它们。如果浮点是您的锤子包,请使用
float.h
。你所寻求的一切都应该(更好)处于
极限。h
。如果不是,则可能没有平台无关的获取方法。这是假设2是补码,没有填充,并且
CHAR\u BIT
给出了每个字节的位数。另外,这还不包括浮点类型。我想看看
float
double
,等等的结果会是什么,我假设这些都包含在“所有数据类型”中(这看起来确实有点公开)如果我想找出浮点中小数点后的值,那么假设f=12.345678,我将如何找到它。它是在小数点后预定义的六个点,所以我们如何计算它,它在小数点后只有6位数的范围。是否有其他方法来找到它,取决于精度(p),你可以将f乘以10^p。这意味着你想说,我们可以改变小数点后的数字大小大于6小于6???它适用于所有的数据类型吗?如果我想找出浮点小数点后的值,那么我该如何找到它呢?假设f=12.345678。它是小数点后预定义的六个点,那么我们如何计算呢它的小数点后只有6位数的范围,还有别的办法吗it@user3591571,它是非整数类型的边缘值,如float/double。然而,了解这些类型的详细结构,我们也可以设计一种方法来确定这些类型的限制。Moriancumercan我们可以使用sizeof运算符???@user3591571找出这些非整数类型的范围,不幸的是没有。仅sizeof()这样的类型仅仅是一个提示;但是,如果正确理解了这些类型的内部结构,那么可以使用这样的提示来确定限制。浮点小数后的数字呢。我知道我们必须使用头文件。但是有没有其他方法可以改变浮点小数后的数字大小浮点类型更为复杂,因为它们可能有很多属性(无穷大、负零等),标准中有几个宏和函数可以处理这些属性。没有这些宏,就无法直接观察它们。@Jens Gustedt谢谢
UCHAR_MAX  = 255
UCHAR_MAX  = 255
USHRT_MAX  = 65535
USHRT_MAX  = 65535
UINT_MAX   = 4294967295
UINT_MAX   = 4294967295
ULONG_MAX  = 18446744073709551615
ULONG_MAX  = 140731079060271