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

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.

But are there any standards for C++?

I'm using Visual Studio 2008 on a 32-bit architecture. Here is what I get:

char  : 1 byte
short : 2 bytes
int   : 4 bytes
long  : 4 bytes
float : 4 bytes
double: 8 bytes

I tried to find, without much success, reliable information stating the sizes of char , short , int , long , double , float (and other types I didn't think of) under different architectures and compilers.


The C++ standard does not specify the size of integral types in bytes, but it specifies minimum ranges they must be able to hold. You can infer minimum size in bits from the required range. You can infer minimum size in bytes from that and the value of the CHAR_BIT macro that defines the number of bits in a byte (in all but the most obscure platforms it's 8, and it can't be less than 8).

One additional constraint for char is that its size is always 1 byte, or CHAR_BIT bits (hence the name).

Minimum ranges required by the standard (page 22) are:

and Data Type Ranges on MSDN:

  • signed char : -127 to 127 (note, not -128 to 127; this accommodates 1's-complement and sign-and-magnitude platforms)
  • unsigned char : 0 to 255
  • "plain" char : same range as signed char or unsigned char , implementation-defined
  • signed short : -32767 to 32767
  • unsigned short : 0 to 65535
  • signed int : -32767 to 32767
  • unsigned int : 0 to 65535
  • signed long : -2147483647 to 2147483647
  • unsigned long : 0 to 4294967295
  • signed long long : -9223372036854775807 to 9223372036854775807
  • unsigned long long : 0 to 18446744073709551615
  • A C++ (or C) implementation can define the size of a type in bytes sizeof(type) to any value, as long as

  • the expression sizeof(type) * CHAR_BIT evaluates to a number of bits high enough to contain required ranges, and
  • the ordering of type is still valid (eg sizeof(int) <= sizeof(long) ).
  • The actual implementation-specific ranges can be found in <limits.h> header in C, or <climits> in C++ (or even better, templated std::numeric_limits in <limits> header).

    For example, this is how you will find maximum range for int :

    C:

    #include <limits.h>
    const int min_int = INT_MIN;
    const int max_int = INT_MAX;
    

    C++ :

    #include <limits>
    const int min_int = std::numeric_limits<int>::min();
    const int max_int = std::numeric_limits<int>::max();
    

    For 32-bit systems, the 'de facto' standard is ILP32 — that is, int , long and pointer are all 32-bit quantities.

    For 64-bit systems, the primary Unix 'de facto' standard is LP64 — long and pointer are 64-bit (but int is 32-bit). The Windows 64-bit standard is LLP64 — long long and pointer are 64-bit (but long and int are both 32-bit).

    At one time, some Unix systems used an ILP64 organization.

    None of these de facto standards is legislated by the C standard (ISO/IEC 9899:1999), but all are permitted by it.

    And, by definition, sizeof(char) is 1 , notwithstanding the test in the Perl configure script.

    Note that there were machines (Crays) where CHAR_BIT was much larger than 8. That meant, IIRC, that sizeof(int) was also 1, because both char and int were 32-bit.


    In practice there's no such thing. You can expect std::size_t to always represent the unsigned native integer size on current architecture. ie 16-bit, 32-bit or 64-bit.

    But as far as all the other built-in types go, it really depends on the compiler. Here's two excerpts taken from the current working draft of the latest C++ standard:

    There are five standard signed integer types : signed char, short int, int, long int, and long long int. In this list, each type provides at least as much storage as those preceding it in the list.

    For each of the standard signed integer types, there exists a corresponding (but different) standard unsigned integer type: unsigned char, unsigned short int, unsigned int, unsigned long int, and unsigned long long int, each of which occupies the same amount of storage and has the same alignment requirements.

    If you want to you can statically (compile-time) assert the sizeof these fundamental types. It will alert people to think about porting your code if the sizeof assumptions change.

    链接地址: http://www.djcxy.com/p/1052.html

    上一篇: C ++方法声明中最后一个“const”的含义?

    下一篇: C ++标准规定int,long类型的大小是什么?