2015-08-14 5 views
1

В C99 мы имеем целые типы фиксированного размера, определенные в stdint.h. В stdlib.h мы имеем абса и ДИВА функции, которые работают на INT с, а также их долго INT/длинный длинный ИНТ коллеги лаборатории, llabs, ldiv , lldiv.Как использовать абс и div с целыми числами фиксированного размера

Поскольку размер междунар/длинный/долго долго варьируется в зависимости от платформы и используется компилятор Интересно, как выбрать правильный вариант абс/дел при использовании целых чисел фиксированного размера, как int16_t, int32_t или int64_t?

+0

Включите дополнительные предупреждения, и компилятор скажет вам. И если вы беспокоитесь, ошибайтесь в безопасности и всегда используйте версии с длинными длинными версиями. –

+0

Существуют также варианты 'intmax_t'. И вы можете определить свой собственный набор функций, если хотите использовать функцию вместо прямой записи эквивалентного кода. – cremno

ответ

1

Предполагая, что вы можете использовать компилятор C11, вы можете использовать функцию Generic macros и определить оболочку, которая охватывает целые числа фиксированного размера. Примером может выглядеть следующим образом:

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

Хитрость заключается в том, что эти целые числа фиксированного размера просто введите определения для стандартных целочисленных типов.