What does the C++ standard state the size of int, long type to be?

前端 未结 24 2220
无人及你
无人及你 2020-11-21 04:42

I\'m looking for detailed information regarding the size of basic C++ types. I know that it depends on the architecture (16 bits, 32 bits, 64 bits) and the compiler.

24条回答
  •  既然无缘
    2020-11-21 05:04

    If you are interested in a pure C++ solution, I made use of templates and only C++ standard code to define types at compile time based on their bit size. This make the solution portable across compilers.

    The idea behind is very simple: Create a list containing types char, int, short, long, long long (signed and unsigned versions) and the scan the list and by the use of numeric_limits template select the type with given size.

    Including this header you got 8 type stdtype::int8, stdtype::int16, stdtype::int32, stdtype::int64, stdtype::uint8, stdtype::uint16, stdtype::uint32, stdtype::uint64.

    If some type cannot be represented it will be evaluated to stdtype::null_type also declared in that header.

    THE CODE BELOW IS GIVEN WITHOUT WARRANTY, PLEASE DOUBLE CHECK IT.
    I'M NEW AT METAPROGRAMMING TOO, FEEL FREE TO EDIT AND CORRECT THIS CODE.
    Tested with DevC++ (so a gcc version around 3.5)

    #include 
    
    namespace stdtype
    {
        using namespace std;
    
    
        /*
         * THIS IS THE CLASS USED TO SEMANTICALLY SPECIFY A NULL TYPE.
         * YOU CAN USE WHATEVER YOU WANT AND EVEN DRIVE A COMPILE ERROR IF IT IS 
         * DECLARED/USED.
         *
         * PLEASE NOTE that C++ std define sizeof of an empty class to be 1.
         */
        class null_type{};
    
        /*
         *  Template for creating lists of types
         *
         *  T is type to hold
         *  S is the next type_list type
         *
         *  Example:
         *   Creating a list with type int and char: 
         *      typedef type_list > test;
         *      test::value         //int
         *      test::next::value   //char
         */
        template  struct type_list
        {
            typedef T value;
            typedef S next;         
    
        };
    
    
    
    
        /*
         * Declaration of template struct for selecting a type from the list
         */
        template  struct select_type;
    
    
        /*
         * Find a type with specified "b" bit in list "list"
         *
         * 
         */
        template  struct find_type
        {   
            private:
                //Handy name for the type at the head of the list
                typedef typename list::value cur_type;
    
                //Number of bits of the type at the head
                //CHANGE THIS (compile time) exp TO USE ANOTHER TYPE LEN COMPUTING
                enum {cur_type_bits = numeric_limits::digits};
    
            public:
                //Select the type at the head if b == cur_type_bits else
                //select_type call find_type with list::next
                typedef  typename select_type::type type;
        };
    
        /*
         * This is the specialization for empty list, return the null_type
         * OVVERRIDE this struct to ADD CUSTOM BEHAVIOR for the TYPE NOT FOUND case
         * (ie search for type with 17 bits on common archs)
         */
        template  struct find_type
        {   
            typedef null_type type;
    
        };
    
    
        /*
         * Primary template for selecting the type at the head of the list if
         * it matches the requested bits (b == ctl)
         *
         * If b == ctl the partial specified templated is evaluated so here we have
         * b != ctl. We call find_type on the next element of the list
         */
        template  struct select_type
        {   
                typedef  typename find_type::type type; 
        };
    
        /*
         * This partial specified templated is used to select top type of a list
         * it is called by find_type with the list of value (consumed at each call)
         * the bits requested (b) and the current type (top type) length in bits
         *
         * We specialice the b == ctl case
         */
        template  struct select_type
        {
                typedef typename list::value type;
        };
    
    
        /*
         * These are the types list, to avoid possible ambiguity (some weird archs)
         * we kept signed and unsigned separated
         */
    
        #define UNSIGNED_TYPES type_list > > > >
    
        #define SIGNED_TYPES type_list > > > >
    
    
    
        /*
         * These are acutally typedef used in programs.
         * 
         * Nomenclature is [u]intN where u if present means unsigned, N is the 
         * number of bits in the integer
         *
         * find_type is used simply by giving first a type_list then the number of 
         * bits to search for.
         *
         * NB. Each type in the type list must had specified the template 
         * numeric_limits as it is used to compute the type len in (binary) digit.
         */
        typedef find_type::type  uint8;
        typedef find_type::type uint16;
        typedef find_type::type uint32;
        typedef find_type::type uint64;
    
        typedef find_type::type    int8;
        typedef find_type::type   int16;
        typedef find_type::type   int32;
        typedef find_type::type   int64;
    
    }
    

提交回复
热议问题