#include #include unsigned long long cntULL, lastULL; long long cntSLL, lastSLL; unsigned long cntUL, lastUL; long cntSL, lastSL; long long deltaSLL; long deltaSL; int deltaSI; unsigned long long deltaULL; unsigned long deltaUL; unsigned int deltaUI; #define COUNTER_PREP(t,v) \ cnt ## t = v; \ last ## t = cnt ## t; \ cnt ## t += 100; #define COUNTER_TEST(v) \ COUNTER_PREP(ULL, v); \ COUNTER_PREP(SLL, v); \ COUNTER_PREP(UL,(unsigned long)v); \ COUNTER_PREP(SL,(long)v); \ calc_delta(v); #define CALC_DELTA(t,ta,tb) \ delta ## t = cnt ## ta - last ## tb; #define CALC_TEST(ta, tb) \ CALC_DELTA(ULL, ta, tb); \ CALC_DELTA(UL, ta, tb); \ CALC_DELTA(UI, ta, tb); \ CALC_DELTA(SLL, ta, tb); \ CALC_DELTA(SL, ta, tb); \ CALC_DELTA(SI, ta, tb); \ print_delta(#ta, #tb); void print_delta(const char *ta, const char *tb) { printf(" %3.3s,%3.3s\t %20llu,%10lu,%5u %20lld,%10ld,%5d\n", ta, tb, deltaULL, deltaUL, deltaUI, deltaSLL, deltaSL, deltaSI ); } void calc_delta(unsigned long long val) { printf("--- %llx\n", val); CALC_TEST(ULL, ULL); CALC_TEST(SLL, SLL); CALC_TEST(UL, UL); CALC_TEST(SL, SL); CALC_TEST(ULL, UL); CALC_TEST(ULL, SL); CALC_TEST(SLL, UL); CALC_TEST(SLL, SL); CALC_TEST(UL, SL); CALC_TEST(SL, UL); } int main(int argc, char *argv[]) { COUNTER_TEST(0xFFFFFFFFFFFFFFF1ULL); COUNTER_TEST(0x7FFFFFFFFFFFFFF1ULL); COUNTER_TEST(-0x7FFFFFFFFFFFFFF1ULL); COUNTER_TEST(0x1ULL); COUNTER_TEST(-0x1FULL); COUNTER_TEST(0xFFFFFFF1ULL); COUNTER_TEST(0x7FFFFFF1ULL); COUNTER_TEST(-0x7FFFFFFF1ULL); COUNTER_TEST(0x100000001ULL); COUNTER_TEST(-0x10000001FULL); exit(0); }