获取C中变量的最大值

use*_*556 10 c

在C中是否有一个函数返回这样的变量的最大值(我将在下面的例子中命名函数"maxvalue")?

int a;
printf("%d", maxvalue(a)); // 32767
unsigned int b;
printf("%d", maxvalue(b)); // 65535
Run Code Online (Sandbox Code Playgroud)

所以基本上函数返回的值就像INT_MAX变量是有符号的INT,UINT_MAX是无符号的int等.

Mik*_*wan 8

这种功能不是由C标准库定义的.您可以尝试定义计算它的宏:

#define MAX_VALUE(a) (((unsigned long long)1 << (sizeof(a) * CHAR_BIT)) - 1)
Run Code Online (Sandbox Code Playgroud)

使用时,请注意将其分配给足够大的类型.例如:

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

#define IS_TYPE_SIGNED(a) ((a-1) < 0)
#define MAX_VALUE_UNSIGNED(a) (((unsigned long long)1 << \
        (sizeof(a) * CHAR_BIT)) - 1)
#define MAX_VALUE_SIGNED(a) (MAX_VALUE_UNSIGNED(a) >> 1)
#define MAX_VALUE(a) (IS_TYPE_SIGNED(a) ? \
        MAX_VALUE_SIGNED(a) : MAX_VALUE_UNSIGNED(a))

int main(void)
{
    unsigned int i = 0;
    signed int j = 0;

    printf("%llu\n", MAX_VALUE(i));
    printf("%llu\n", MAX_VALUE(j));
    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

打印出:

4294967295
2147483647
Run Code Online (Sandbox Code Playgroud)

  • 它需要一个`-1`.无论如何,这个问题很接近. (2认同)
  • `(((unsigned long long)1 <<(sizeof(a)*CHAR_BIT)) - 1)`因为移位运算符计数溢出而不能用于`(unsigned)long long`类型的'a'.这是未定义的行为. (2认同)

Car*_*rum 7

您可以使用C11类型通用表达式轻松完成:

#define maxvalue(type) _Generic(type, int: INT_MAX, \
                                      unsigned int: UINT_MAX)
Run Code Online (Sandbox Code Playgroud)

它不是一个功能,但我认为它可以满足您的需求.这是一个简单的示例程序:

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

#define maxvalue(type) _Generic(type, int: INT_MAX, \
                                      unsigned int: UINT_MAX)

int main(void)
{
    int i;
    unsigned int ui;

    printf("%u\n", maxvalue(i));
    printf("%u\n", maxvalue(ui));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它的输出:

$ clang -Wall -Werror -Wextra -pedantic -std=c11 example.c -o example
$ ./example 
2147483647
4294967295
Run Code Online (Sandbox Code Playgroud)

我的答案比你的大,因为我的系统有32位整数.您似乎有一台16位计算机.


Jim*_*ter 5

以下是我的库中适用于类型而不是变量的宏:

/* min and max integer values.  T is a signed or unsigned integer type. */

/* Returns 1 if T is signed, else 0. */
#define INTTYPE_SIGNED(T) ((T)-1 < (T)0)

/*
 * Returns (T)(maximum value of a T).
 *
 * Pains are taken (perhaps unnecessarily) to avoid integer overflow
 * with signed types.
 */
#define INTTYPE_MAX(T)                      \
    (((T)1 << (CHAR_BIT*sizeof(T)-INTTYPE_SIGNED(T)-1)) - 1 +   \
     ((T)1 << (CHAR_BIT*sizeof(T)-INTTYPE_SIGNED(T)-1)))

/*
 * Returns (T)(minimum value of a T).

 * Pains are taken (perhaps unnecessarily) to avoid integer overflow
 * with signed types.
 * assert: twos complement architecture
 */
#define INTTYPE_MIN(T) ((T)(-INTTYPE_MAX(T)-1))
Run Code Online (Sandbox Code Playgroud)

编辑:将这些内容适应问题:

/* min and max integer values.  V is a signed or unsigned integer value. */

/* Returns 1 if V has signed type, else 0. */
#define INT_VALUE_SIGNED(V) ((V)-(V)-1 < 0)

/*
 * Returns maximum value for V's type.
 *
 * Pains are taken (perhaps unnecessarily) to avoid integer overflow
 * with signed types.
 */
#define INT_VALUE_MAX(V)                        \
    (((V)-(V)+1 << (CHAR_BIT*sizeof(V)-INT_VALUE_SIGNED(V)-1)) - 1 +    \
     ((V)-(V)+1 << (CHAR_BIT*sizeof(V)-INT_VALUE_SIGNED(V)-1)))

/*
 * Returns minimum value for V's type.

 * Pains are taken (perhaps unnecessarily) to avoid integer overflow
 * with signed types.
 * assert: twos complement architecture
 */
#define INT_VALUE_MIN(V) (-INT_VALUE_MAX(V)-1)
Run Code Online (Sandbox Code Playgroud)

事后思考:如果 V 是变量或包含变量的表达式,且尚未赋值,则这些调用 UB ...这就是所提出的问题中的情况。它们可能适用于许多实现,但 C 标准并不保证这一点,并且它们肯定会在使用陷阱值初始化未初始化变量的实现上失败。