如何将 abs 和 div 与固定大小的整数一起使用

How to use abs and div with fixed-size integers

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

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

假设您能够使用 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;
}

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