SCHAR_MIN : minimum value for a signed char
SCHAR_MAX : maximum value for a signed char
UCHAR_MAX : maximum value for an unsigned char
CHAR_MIN : minimum value for a char
CHAR_MAX : maximum value for a char
SHRT_MIN : minimum value for a short
SHRT_MAX : maximum value for a short
USHRT_MAX : maximum value for an unsigned short
INT_MIN : minimum value for an int
INT_MAX : maximum value for an int
UINT_MAX : maximum value for an unsigned int
LONG_MIN : minimum value for a long
LONG_MAX : maximum value for a long
ULONG_MAX : maximum value for an unsigned long
LLONG_MIN : minimum value for a long long
LLONG_MAX : maximum value for a long long
ULLONG_MAX : maximum value for an unsigned long long
PTRDIFF_MIN : minimum value of ptrdiff_t
PTRDIFF_MAX : maximum value of ptrdiff_t
SIZE_MAX : maximum value of size_t
SIG_ATOMIC_MIN : minimum value of sig_atomic_t
SIG_ATOMIC_MAX : maximum value of sig_atomic_t
WINT_MIN : minimum value of wint_t
WINT_MAX : maximum value of wint_t
WCHAR_MIN : minimum value of wchar_t
WCHAR_MAX : maximum value of wchar_t
CHAR_BIT : number of bits in a char
MB_LEN_MAX : maximum length of a multibyte character in bytes
FLT_MIN : smallest normalised positive value of a float
FLT_MAX : largest positive finite value of a float
DBL_MIN : smallest normalised positive value of a double
DBL_MAX : largest positive finite value of a double
LDBL_MIN : smallest normalised positive value of a long double
LDBL_MAX : largest positive finite value of a long double
FLT_DIG : the number of decimal digits guaranteed to be preserved converting from text to float and back to text
DBL_DIG : the number of decimal digits guaranteed to be preserved converting from text to double and back to text
LDBL_DIG : the number of decimal digits guaranteed to be preserved converting from text to long double and back to text
#include<stdio.h>
int main(void)
{
printf("Minimum Signed Char %d\n",-(char)((unsigned char) ~0 >> 1) - 1);
printf("Maximum Signed Char %d\n",(char) ((unsigned char) ~0 >> 1));
printf("Minimum Signed Short %d\n",-(short)((unsigned short)~0 >>1) -1);
printf("Maximum Signed Short %d\n",(short)((unsigned short)~0 >> 1));
printf("Minimum Signed Int %d\n",-(int)((unsigned int)~0 >> 1) -1);
printf("Maximum Signed Int %d\n",(int)((unsigned int)~0 >> 1));
printf("Minimum Signed Long %ld\n",-(long)((unsigned long)~0 >>1) -1);
printf("Maximum signed Long %ld\n",(long)((unsigned long)~0 >> 1));
/* Unsigned Maximum Values */
printf("Maximum Unsigned Char %d\n",(unsigned char)~0);
printf("Maximum Unsigned Short %d\n",(unsigned short)~0);
printf("Maximum Unsigned Int %u\n",(unsigned int)~0);
printf("Maximum Unsigned Long %lu\n",(unsigned long)~0);
return 0;
}
9条答案
按热度按时间xzv2uavs1#
您将需要使用
limits.h
,它提供了以下常量(根据链接引用):其中
U*_MIN
由于显而易见的原因而被省略(任何无符号类型的最小值都是0
)。类似地,
float.h
为float
和double
类型提供限制:浮点类型是关于零对称的,所以最负的有限数是最正的有限数的反-例如
float
的范围从-FLT_MAX
到FLT_MAX
。请注意,浮点类型只能精确地表示其范围内的一小部分有限的值。随着存储的绝对值变大,可以精确表示的相邻数字之间的间距也会变大。
bbuxkriu2#
"但是glyph",我听到你问,"如果我必须确定一个不透明类型的最大值,而它的最大值最终可能会改变,那该怎么办?"你可能会继续说:"如果它是一个我不控制的库中的typedef呢?"
我很高兴你这么问,因为我刚刚花了几个小时想出了一个解决方案(然后我不得不扔掉,因为它没有解决我的实际问题)。
您可以使用这个方便的
maxof
宏来确定任何有效整数类型的大小。您可以这样使用它:
如果愿意,可以在这些宏的前面添加一个'(t)',这样它们就可以给出您所请求的类型的结果,并且您不必进行强制转换来避免警告。
q35jwt9p3#
任何 * unsigned * 整型的 * 最大 * 值:
((t)~(t)0)
//几乎适用于所有情况的通用表达式。(~(t)0)
//如果你知道你的类型t
等于或大于unsigned int
。此施法强制类型升级。((t)~0U)
//如果您知道类型t
的大小等于或小于unsigned int
。此强制转换在计算unsigned int
类型表达式~0U
之后将类型降级。例如:
size_t
(又称SIZE_MAX
宏)的最大值可以定义为(~(size_t)0)
。Linux kernel source code可以这样定义SIZE_MAX
宏。任何 * signed * 整型的 * 最大 * 值:
t
类型的无符号变量,((t)(((unsigned t)~(unsigned t)0)>>1))
将提供你所需要的最快的结果。(((t)1<<(sizeof(t)*CHAR_BIT-2))-1)*2+1
任何 * 有符号 * 整型的 * 最小 * 值:
你必须知道你的机器的有符号数表示法,大多数机器使用2的补码,所以下面的方法对你来说是可行的:
若要检测计算机是否使用2的补码,请检测
((t)~(t)0)
和(t)(-1)
是否表示相同的东西。* 更新(2022 - 03 - 24):*(t)
应该是有符号类型。C99标准要求从有符号整数类型到无符号整数类型的转换行为。无论有符号整数类型中的值-* N * 的 * 对象表示 * 如何,将-* N * 转换为无符号整数类型始终生成1加上无符号类型的最大值减去 * N * 的值。例如,(unsigned long)(-(N))
等于ULONG_MAX+1-(N)
。结合以上内容,这将给出任何 * 有符号 * 整型的 * 最小 * 值:
不过有一点要注意所有这些表达式都使用类型转换或
sizeof
运算符,因此它们都不能在预处理器条件(#if
...#elif
...#endif
等)中工作。whlutmcx4#
我写了一些宏,它们返回任何类型的最小值和最大值,而不管有无符号:
示例代码:
w7t8yxp55#
头文件
limits.h
定义了扩展到标准整数类型的各种限制和参数的宏。aurhwmvo6#
332nm8kg7#
请查看limits.h和float.h上的这些页面,它们是标准c库的一部分。
col17t5w8#
要获取宽度至少为
unsigned int
的无符号整数类型t
(否则整数提升会出现问题):~(t) 0
。如果还想支持更短的类型,则可以添加另一种类型转换:(t) ~(t) 0
.如果整数类型
t
有符号,假设没有填充位,可以使用:这个公式的优点是它不基于
t
的无符号版本(或更大的类型),因为无符号版本可能是未知或不可用的(即使uintmax_t
也可能不足以用于非标准扩展)。在二进制补码中,最小值与最大值相反,即减1(在ISO C标准允许的其他整数表示法中,这正好与最大值相反)。
注:要检测符号以决定使用哪个版本:
(t) -1 < 0
可以使用任何整数表示,有符号整数类型为1(true),无符号整数类型为0(false)。t9eec4r09#
任何整数数据类型的MIN和MAX值都可以在不使用任何库函数的情况下计算,如下所示,并且相同的逻辑可以应用于其他整数类型short、int和long。