如何将 abs 和 div 与固定大小的整数一起使用
How to use abs and div with fixed-size integers
在 C99 中,我们有固定大小的整数类型,在 stdint.h 中定义。
在 stdlib.h 中我们有 abs 和 div 函数ints,以及它们的 long int/long long int 对应 labs, llabs、ldiv、lldiv。
由于 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;
}
诀窍在于这些固定大小的整数只是标准整数类型的类型定义。
在 C99 中,我们有固定大小的整数类型,在 stdint.h 中定义。 在 stdlib.h 中我们有 abs 和 div 函数ints,以及它们的 long int/long long int 对应 labs, llabs、ldiv、lldiv。
由于 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;
}
诀窍在于这些固定大小的整数只是标准整数类型的类型定义。