2015-08-14 27 views
1

在C99中我们有固定大小的整数类型,在stdint.h中定义。 在stdlib.h中我们有ABS和上INT s运行功能,以及他们长整型/长长整型同行实验室llabsLDIVlldiv如何使用固定大小整数的abs和div

由于int的长度/长/长长的变化的基础上的平台和使用的编译器不知道如何使用固定大小的整数像int16_t时选择ABS/DIV权变种,int32_t或的int64_t?

+0

启用更多警告,编译器会告诉你。如果您担心,请在安全方面犯错,并始终使用“long long”版本。 –

+0

还有'intmax_t'变种。如果您想使用函数而不是直接编写等效代码,则可以定义自己的一组函数。 – cremno

回答

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; 
} 

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