#include "stdio.h" #if ULONG_MAX > 4294967295U typedef long intType; #define INT_SUFFIX(num) num ## L #define SUFFIX "L" #define INTTYPE_FORMAT "l" #define MESSAGE "Using long.\n" #else typedef long long intType; #define INT_SUFFIX(num) num ## LL #define SUFFIX "LL" #define INTTYPE_FORMAT "ll" #define MESSAGE "Using long long.\n" #endif #define F_D(width) "%" #width INTTYPE_FORMAT "d" #if 0 /* Allow the compiler to compute the division. */ #define intExpr(num) (num) #else /* The division will (probably) be done at runtime. */ intType intExpr (intType number) { return number; } #endif int main (int argc, char **argv) { printf("sizeof(long): %lu\n", sizeof(long)); printf("sizeof(long long): %lu\n", sizeof(long long)); printf(MESSAGE); printf("-9223372036854775808" SUFFIX " / -2147483649" SUFFIX " = " F_D(20) " expected: 4294967294\n", intExpr(INT_SUFFIX(-9223372036854775807)-1) / INT_SUFFIX(-2147483649)); printf("-9223372036854775808" SUFFIX " / -2147483648" SUFFIX " = " F_D(20) " expected: 4294967296\n", intExpr(INT_SUFFIX(-9223372036854775807)-1) / INT_SUFFIX(-2147483648)); printf(" 9223372036854775807" SUFFIX " / -2147483649" SUFFIX " = " F_D(20) " expected: -4294967294\n", intExpr(INT_SUFFIX( 9223372036854775807)) / INT_SUFFIX(-2147483649)); printf(" 9223372036854775807" SUFFIX " / -2147483648" SUFFIX " = " F_D(20) " expected: -4294967295\n", intExpr(INT_SUFFIX( 9223372036854775807)) / INT_SUFFIX(-2147483648)); printf("-9223372036854775808" SUFFIX " %% -2147483649" SUFFIX " = " F_D(20) " expected: -2\n", intExpr(INT_SUFFIX(-9223372036854775807)-1) % INT_SUFFIX(-2147483649)); printf("-9223372036854775808" SUFFIX " %% -2147483648" SUFFIX " = " F_D(20) " expected: 0\n", intExpr(INT_SUFFIX(-9223372036854775807)-1) % INT_SUFFIX(-2147483648)); printf(" 9223372036854775807" SUFFIX " %% -2147483649" SUFFIX " = " F_D(20) " expected: 1\n", intExpr(INT_SUFFIX( 9223372036854775807)) % INT_SUFFIX(-2147483649)); printf(" 9223372036854775807" SUFFIX " %% -2147483648" SUFFIX " = " F_D(20) " expected: 2147483647\n", intExpr(INT_SUFFIX( 9223372036854775807)) % INT_SUFFIX(-2147483648)); return 0; }