min and max value of data type in C

后端 未结 9 1693
借酒劲吻你
借酒劲吻你 2020-11-29 17:51

What is the function to determine the min and max possible of value of datatypes (i.e, int, char.etc) in C?

9条回答
  •  谎友^
    谎友^ (楼主)
    2020-11-29 18:34

    "But glyph", I hear you asking, "what if I have to determine the maximum value for an opaque type whose maximum might eventually change?" You might continue: "What if it's a typedef in a library I don't control?"

    I'm glad you asked, because I just spent a couple of hours cooking up a solution (which I then had to throw away, because it didn't solve my actual problem).

    You can use this handy maxof macro to determine the size of any valid integer type.

    #define issigned(t) (((t)(-1)) < ((t) 0))
    
    #define umaxof(t) (((0x1ULL << ((sizeof(t) * 8ULL) - 1ULL)) - 1ULL) | \
                        (0xFULL << ((sizeof(t) * 8ULL) - 4ULL)))
    
    #define smaxof(t) (((0x1ULL << ((sizeof(t) * 8ULL) - 1ULL)) - 1ULL) | \
                        (0x7ULL << ((sizeof(t) * 8ULL) - 4ULL)))
    
    #define maxof(t) ((unsigned long long) (issigned(t) ? smaxof(t) : umaxof(t)))
    

    You can use it like so:

    int main(int argc, char** argv) {
        printf("schar: %llx uchar: %llx\n", maxof(char), maxof(unsigned char));
        printf("sshort: %llx ushort: %llx\n", maxof(short), maxof(unsigned short));
        printf("sint: %llx uint: %llx\n", maxof(int), maxof(unsigned int));
        printf("slong: %llx ulong: %llx\n", maxof(long), maxof(unsigned long));
        printf("slong long: %llx ulong long: %llx\n",
               maxof(long long), maxof(unsigned long long));
        return 0;
    }
    

    If you'd like, you can toss a '(t)' onto the front of those macros so they give you a result of the type that you're asking about, and you don't have to do casting to avoid warnings.

提交回复
热议问题