/* http://www.pixelbeat.org/programming/int_types/ */ #define __USE_MINGW_ANSI_STDIO 1 /* So mingw uses its printf not msvcrt */ #define _FILE_OFFSET_BITS 64 #include #include #include /* for UINT_MAX */ #include /* for time_t */ #include /* for off_t */ #define TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) #define TYPE_WIDTH(t) (sizeof (t) * CHAR_BIT) #define TYPE_MAX(t) \ ((t) (! TYPE_SIGNED (t) \ ? (t) -1 \ : ((((t) 1 << (TYPE_WIDTH (t) - 2)) - 1) * 2 + 1))) int main(void) { uint32_t uint32=0xffffFFFF; uintmax_t uintmax=UINTMAX_MAX; off_t offset=TYPE_MAX(off_t); /* Depends on _FILE_OFFSET_BITS */ time_t time=TYPE_MAX(time_t); /* May be float! */ size_t size=TYPE_MAX(size_t); /* Depends on int size */ printf("native int bits %20zu %16x\n" "native long bits%20zu %16lx\n" "uint32_t max %20"PRIu32" %16"PRIx32"\n" "uintmax_t max %20ju %16jx\n" /* try PRIuMAX if %ju unsupported */ "off_t max %20jd %16jx\n" /* try PRIdMAX if %jd unsupported */ "time_t max %20jd %16jx\n" "size_t max %20zu %16zx\n", sizeof(int)*CHAR_BIT, UINT_MAX, sizeof(long)*CHAR_BIT, ULONG_MAX, uint32, uint32, uintmax, uintmax, (intmax_t)offset, (intmax_t)offset, (intmax_t)time, (intmax_t)time, size, size); #if defined __GNUC__ && defined _LP64 unsigned __int128 ui128=TYPE_MAX(unsigned __int128); /* Note no way to specify constants > UINTMAX_MAX. Also printing is awkward and only feasible really for hex. */ printf("__int128 max %20s %016"PRIx64"%016"PRIx64"\n", "", (uint64_t)(ui128>>64),(uint64_t)ui128); #endif return 0; }