2015-08-14 40 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; 
} 

訣竅是,這些固定大小的整數只是類型定義標準整數類型