Benutzer-Werkzeuge

Webseiten-Werkzeuge


edv:prg:c:datatyp:data_type_ranges

Data Type Ranges

:!: Einige Typen sind plattform- und andere compilerabhängig. Deshalb sind folgende Infos nicht als uneingeschränkt gültig zu betrachten! (Der GNU-Compiler kann z.B. einige Typen anders interpretieren als z.B. der MS VS-Compiler.)

GNU-Compiler

Hier ist eine kleine Zusammenfassung aus den Seiten http://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html#Primitive-Types und http://www.gnu.org/software/libc/manual/html_node/Range-of-Type.html

(Der C99-Standard erweitert die Ranges um die 64-Bit Typen.)

Type Name Bytes Other Names Range of Values Kommentar
signed char 1 none SCHAR_MIN to SCHAR_MAX (−128 to 127)
unsigned char 1 none 0 to 255
char 1 none CHAR_MIN to CHAR_MAX. Depending on your system, the char data type is defined as having the same range as either the signed char or the unsigned char data type.
short int 2 short, signed short int, signed short SHRT_MIN to SHRT_MAX (−32.768 to 32.767)
unsigned short int 2 unsigned short 0 to 65.535
int 4 signed int, signed INT_MIN to INT_MAX (−2.147.483.648 to 2.147.483.647)
unsigned int 4 unsigned 0 to 4.294.967.295
long int 4,
kann 8 Byte sein (auf 64-Bit Systemen)
long, signed long int, signed long LONG_MIN to LONG_MAX (−2.147.483.648 to 2.147.483.647)
unsigned long int 4,
kann 8 Byte sein (auf 64-Bit Systemen)
unsigned long 0 to 4.294.967.295
long long int 8 long long, signed long long int, signed long long LLONG_MIN to LLONG_MAX (−9.223.372.036.854.775.808 to 9.223.372.036.854.775.807) Kein Bestandteil von C89, jedoch von C99 und GNU C extension.
unsigned long long int8 unsigned long long 0 to 18.446.744.073.709.551.615 Kein Bestandteil von C89, jedoch von C99 und GNU C extension.
float FIXME FLT_MIN (darf nicht größer als 1e-37 sein) to FLT_MAX (darf nicht kleiner als 1e37 sein)
double FIXME DBL_MIN to DBL_MAX
long double FIXME LDBL_MIN to LDBL_MAX

Visual Studio 2010

Hier ist ein Auszug aus der Seite http://msdn.microsoft.com/en-us/library/s3f49ktz(v=vs.100).aspx

Type Name Bytes Other Names Range of Values
int 4 signed –2,147,483,648 to 2,147,483,647
unsigned int 4 unsigned 0 to 4,294,967,295
__int8 1 char –128 to 127
unsigned __int8 1 unsigned char 0 to 255
__int16 2 short, short int, signed short int –32,768 to 32,767
unsigned __int16 2 unsigned short, unsigned short int 0 to 65,535
__int32 4 signed, signed int, int –2,147,483,648 to 2,147,483,647
unsigned __int32 4 unsigned, unsigned int 0 to 4,294,967,295
__int64 8 long long, signed long long –9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
unsigned __int64 8 unsigned long long 0 to 18,446,744,073,709,551,615
bool 1 none false or true
char 1 none –128 to 127 by default
0 to 255 when compiled with /J
signed char 1 none –128 to 127
unsigned char 1 none 0 to 255
short 2 short int, signed short int –32,768 to 32,767
unsigned short 2 unsigned short int 0 to 65,535
long 4 long int, signed long int –2,147,483,648 to 2,147,483,647
unsigned long 4 unsigned long int 0 to 4,294,967,295
long long 8 none (but equivalent to __int64) –9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
unsigned long long 8 none (but equivalent to unsigned __int64) 0 to 18,446,744,073,709,551,615
enum varies none See Remarks.
float 4 none 3.4E +/- 38 (7 digits)
double 8 none 1.7E +/- 308 (15 digits)
long double same as double none same as double
wchar_t 2 __wchar_t 0 to 65,535

:!: Für alle Fälle gilt: char ⇐ short ⇐ int ⇐ long ⇐ long long

Zur Kurzbeschreibung der 64-bit Datenmodelle

Limits ermitteln

Mit diesem Beispiel finden wir die Limits für "int" heraus:

#include <iostream>
#include <limits>
 
using namespace std;
 
int main()
{
	cout << "int: min       = " << numeric_limits<int>::min()	<< endl;
	cout << "int: max       = " << numeric_limits<int>::max()	<< endl;
	cout << "int: digits    = " << numeric_limits<int>::digits	<< endl;
	cout << "int: is_signed = " << numeric_limits<int>::is_signed	<< endl;
 
	return 0;
}

Tatsächliche Byte-Größe ermitteln

Mit diesem Beispiel finden wir heraus, wie viele Bytes die Variablen je nach Typ im Speicher belegen:

//
// Das Programm gibt die Byte-Größen von unterschiedlichen Datentypen aus.
//
 
 
// ---------- Diese Defines bitte stets auf die passende Werte setzen! ----------
//
#define ARCH		"x86_64"
#define BS		"W2K8 SP2"
#define COMPILER	"MS VS2010"
//
// --------------------
 
 
 
#include <stdio.h>
 
 
 
// Bestimmung der Bit-Architektur (32-/64-Bit)
#if (defined SUNx86_32) || (defined SPARC_32) || (defined LINUX_x86) || (defined AIX_PPC_32) || (defined _WIN32 && !defined _WIN64)
	#define BIT_ARCH	32
#elif (defined SUNx86_64) || (defined SPARC_64) || (defined LINUX_x86_64) || (defined AIX_PPC_64) || (defined _WIN64)
	#define BIT_ARCH	64
#else
	#undef BIT_ARCH
#endif
 
#if !defined BIT_ARCH
	#error "BIT_ARCH is not defined"
#endif
 
#if BIT_ARCH == 32
	#define BITMODE		"32-Bit"
#elif BIT_ARCH == 64
	#define BITMODE		"64-Bit"
#else
	#define BITMODE		"undefined"
#endif
 
 
 
#define PRINT_SIZE_OF_TYPE(x)	{ int iSizeOfType = sizeof(x); printf("%2d\t(" #x ")\n", iSizeOfType); }
 
 
int main (int argc, char *argv[])
{
	printf("\nUEbersetzt auf folgendem System:\n\n");
	printf("Architektur:    %s\n", ARCH);
	printf("Betriebssystem: %s\n", BS);
	printf("32-/64-Bit:     %s\n", BITMODE);
	printf("Compiler:       %s\n", COMPILER);
 
	printf("\nsizeof\tType\n");
 
	PRINT_SIZE_OF_TYPE(void*);
 
	PRINT_SIZE_OF_TYPE(char);
	PRINT_SIZE_OF_TYPE(unsigned char);
	PRINT_SIZE_OF_TYPE(short int);
	PRINT_SIZE_OF_TYPE(int);
	PRINT_SIZE_OF_TYPE(long int);
	PRINT_SIZE_OF_TYPE(unsigned long);
	PRINT_SIZE_OF_TYPE(long long int);
	PRINT_SIZE_OF_TYPE(float);
	PRINT_SIZE_OF_TYPE(double);
	PRINT_SIZE_OF_TYPE(long double);
	PRINT_SIZE_OF_TYPE(wchar_t);
 
	return 0;
}

Wobei die Zeile PRINT_SIZE_OF_TYPE(void*); die Pointer-Breite representiert.

Ausgabe:

UEbersetzt auf folgendem System:

Architektur:    x86_64
Betriebssystem: W2K8 SP2
32-/64-Bit:     64-Bit
Compiler:       MS VS2010

sizeof  Type
 8      (void*)
 1      (char)
 1      (unsigned char)
 2      (short int)
 4      (int)
 4      (long int)
 4      (unsigned long)
 8      (long long int)
 4      (float)
 8      (double)
 8      (long double)
 2      (wchar_t)

Stand: 24.02.2015
: Jürgen Kreick

EOF

edv/prg/c/datatyp/data_type_ranges.txt · Zuletzt geändert: 2020/01/11 01:23 von 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki