在 C99 中,我们有固定大小的整数类型,在stdint.h中定义。在stdlib.h中,我们有在int上运行的abs和div函数,以及它们的long int/long long int对应物labs、llabs、ldiv、lldiv。
由于 int/long/long long 的大小因平台和使用的编译器而异,我想知道在使用固定大小的整数(如 int16_t、int32_t 或 int64_t)时如何选择正确的abs/div变体?
假设您能够使用 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;
}
诀窍是这些固定大小的整数只是标准整数类型的类型定义。