1

在 C99 中,我们有固定大小的整数类型,在stdint.h中定义。在stdlib.h中,我们有在int上运行的absdiv函数,以及它们的long int/long long int对应物labsllabsldivlldiv

由于 int/long/long long 的大小因平台和使用的编译器而异,我想知道在使用固定大小的整数(如 int16_t、int32_t 或 int64_t)时如何选择正确的abs/div变体?

4

1 回答 1

1

假设您能够使用 C11 编译器,您可以使用通用宏功能并定义包含固定大小整数的包装器。一个示例可能如下所示:

#include <math.h>
#include <inttypes.h>
#include <stdio.h>

#define safe_abs(n) _Generic((n), \
    signed char: abs(n), short: abs(n), int: abs(n), long: labs(n), long long: llabs(n))

int main(void)
{
    int8_t n1 = -123;
    printf("n1 = %" PRId8 "\n", safe_abs(n1));

    int16_t n2 = -1234;
    printf("n2 = %" PRId16 "\n", safe_abs(n2));

    int32_t n3 = -123456;
    printf("n3 = %" PRId32 "\n", safe_abs(n3));

    int64_t n4 = -12345678910;
    printf("n4 = %" PRId64 "\n", safe_abs(n4));

    return 0;
}

诀窍是这些固定大小的整数只是标准整数类型的类型定义。

于 2015-08-14T10:41:07.917 回答