Unsigned - Bedeutung
-
Hallo,
wozu ist eigentlich unsigned?
In meinem Buch,C++ Primer steht nichts darüber,nur dass es mehr speicherplatz hat usw...
-
Mit int zahl deklariert man eine Integer-Variable. Man reserviert bei den 32-Bit-Maschinen 4 Byte Speicherplatz für eine vorzeichenbehaftete Ganzzahl. 4 Byte sind 4 * 8 = 32 Bit.
Damit kann man binär einen Ganzzahlenbereich von 2 hoch 32 = 4 294 967 296 abdecken.Dieser Bereich entspricht für int heutzutage - 2 147 483 648 ... 0 ... 2 147 483 647.
Es gibt auch die Möglichkeit nur positive Ganzzahlen und die Null zuzulassen. Hierfür muss man ein unsigned vor das int stellen:
unsigned int umfasst 0 ... 4 294 967 295 (32-Bit-Maschinen).int bedeutet somit automatisch signed int.
Solche Details findet man üblicherweise in der Datei limits.h.
Dort findet man die Grenzen für die einzelnen Variablentypen:
char, short, int, long, ...Hier ein Beispiel:
... #define SHRT_MIN (-32768) /* minimum (signed) short value */ #define SHRT_MAX 32767 /* maximum (signed) short value */ #define USHRT_MAX 0xffff /* maximum unsigned short value */ #define INT_MIN (-2147483647 - 1) /* minimum (signed) int value */ #define INT_MAX 2147483647 /* maximum (signed) int value */ #define UINT_MAX 0xffffffff /* maximum unsigned int value */ #define LONG_MIN (-2147483647L - 1) /* minimum (signed) long value */ #define LONG_MAX 2147483647L /* maximum (signed) long value */ #define ULONG_MAX 0xffffffffUL /* maximum unsigned long value */ #if _INTEGRAL_MAX_BITS >= 8 #define _I8_MIN (-127i8 - 1) /* minimum signed 8 bit value */ #define _I8_MAX 127i8 /* maximum signed 8 bit value */ #define _UI8_MAX 0xffui8 /* maximum unsigned 8 bit value */ #endif #if _INTEGRAL_MAX_BITS >= 16 #define _I16_MIN (-32767i16 - 1) /* minimum signed 16 bit value */ #define _I16_MAX 32767i16 /* maximum signed 16 bit value */ #define _UI16_MAX 0xffffui16 /* maximum unsigned 16 bit value */ #endif #if _INTEGRAL_MAX_BITS >= 32 #define _I32_MIN (-2147483647i32 - 1) /* minimum signed 32 bit value */ #define _I32_MAX 2147483647i32 /* maximum signed 32 bit value */ #define _UI32_MAX 0xffffffffui32 /* maximum unsigned 32 bit value */ #endif #if _INTEGRAL_MAX_BITS >= 64 /* minimum signed 64 bit value */ #define _I64_MIN (-9223372036854775807i64 - 1) /* maximum signed 64 bit value */ #define _I64_MAX 9223372036854775807i64 /* maximum unsigned 64 bit value */ #define _UI64_MAX 0xffffffffffffffffui64 #endif #if _INTEGRAL_MAX_BITS >= 128 /* minimum signed 128 bit value */ #define _I128_MIN (-170141183460469231731687303715884105727i128 - 1) /* maximum signed 128 bit value */ #define _I128_MAX 170141183460469231731687303715884105727i128 /* maximum unsigned 128 bit value */ #define _UI128_MAX 0xffffffffffffffffffffffffffffffffui128 #endif ...
-
Erhard Henkes schrieb:
int bedeutet somit automatisch signed int.
Wirklich? Bei char ist's doch auch implementation-defined?!
Erhard Henkes schrieb:
Solche Details findet man üblicherweise in der Datei limits.h.
Och nöö, lies bitte den Forennamen, C**++**, also entweder climits oder (weit besser) limits.
Damit geht das viel einfacher und intuitiver:#include <limits> // UINT_MAX: std::numeric_limits<unsigned int>::max (); // INT_MIN std::numeric_limits<signed int>::min (); // etc.
-
.filmor schrieb:
Erhard Henkes schrieb:
int bedeutet somit automatisch signed int.
Wirklich? Bei char ist's doch auch implementation-defined?!
stimmt. aber eben nur bei char (und wchar_t).
-
Korrekt, aber die Datei oder besser der Standard Header climits
// climits standard header #pragma once #ifndef _CLIMITS_ #define _CLIMITS_ #include <yvals.h> #pragma warning(disable: 4514) #include <limits.h> #endif /* _CLIMITS_ */ /* * Copyright (c) 1992-2005 by P.J. Plauger. ALL RIGHTS RESERVED. * Consult your license regarding permissions and restrictions. V4.05:0009 */
führt letztendlich auch nur zur Datei limits.h, hier die Version aus VC++ 2005:
/*** *limits.h - implementation dependent values * * Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: * Contains defines for a number of implementation dependent values * which are commonly used in C programs. * [ANSI] * * [Public] * ****/ #if _MSC_VER > 1000 #pragma once #endif #include <crtdefs.h> #ifndef _INC_LIMITS #define _INC_LIMITS #define CHAR_BIT 8 /* number of bits in a char */ #define SCHAR_MIN (-128) /* minimum signed char value */ #define SCHAR_MAX 127 /* maximum signed char value */ #define UCHAR_MAX 0xff /* maximum unsigned char value */ #ifndef _CHAR_UNSIGNED #define CHAR_MIN SCHAR_MIN /* mimimum char value */ #define CHAR_MAX SCHAR_MAX /* maximum char value */ #else #define CHAR_MIN 0 #define CHAR_MAX UCHAR_MAX #endif /* _CHAR_UNSIGNED */ #define MB_LEN_MAX 5 /* max. # bytes in multibyte char */ #define SHRT_MIN (-32768) /* minimum (signed) short value */ #define SHRT_MAX 32767 /* maximum (signed) short value */ #define USHRT_MAX 0xffff /* maximum unsigned short value */ #define INT_MIN (-2147483647 - 1) /* minimum (signed) int value */ #define INT_MAX 2147483647 /* maximum (signed) int value */ #define UINT_MAX 0xffffffff /* maximum unsigned int value */ #define LONG_MIN (-2147483647L - 1) /* minimum (signed) long value */ #define LONG_MAX 2147483647L /* maximum (signed) long value */ #define ULONG_MAX 0xffffffffUL /* maximum unsigned long value */ #define LLONG_MAX 9223372036854775807i64 /* maximum signed long long int value */ #define LLONG_MIN (-9223372036854775807i64 - 1) /* minimum signed long long int value */ #define ULLONG_MAX 0xffffffffffffffffui64 /* maximum unsigned long long int value */ #if _INTEGRAL_MAX_BITS >= 8 #define _I8_MIN (-127i8 - 1) /* minimum signed 8 bit value */ #define _I8_MAX 127i8 /* maximum signed 8 bit value */ #define _UI8_MAX 0xffui8 /* maximum unsigned 8 bit value */ #endif #if _INTEGRAL_MAX_BITS >= 16 #define _I16_MIN (-32767i16 - 1) /* minimum signed 16 bit value */ #define _I16_MAX 32767i16 /* maximum signed 16 bit value */ #define _UI16_MAX 0xffffui16 /* maximum unsigned 16 bit value */ #endif #if _INTEGRAL_MAX_BITS >= 32 #define _I32_MIN (-2147483647i32 - 1) /* minimum signed 32 bit value */ #define _I32_MAX 2147483647i32 /* maximum signed 32 bit value */ #define _UI32_MAX 0xffffffffui32 /* maximum unsigned 32 bit value */ #endif #if _INTEGRAL_MAX_BITS >= 64 /* minimum signed 64 bit value */ #define _I64_MIN (-9223372036854775807i64 - 1) /* maximum signed 64 bit value */ #define _I64_MAX 9223372036854775807i64 /* maximum unsigned 64 bit value */ #define _UI64_MAX 0xffffffffffffffffui64 #endif #if _INTEGRAL_MAX_BITS >= 128 /* minimum signed 128 bit value */ #define _I128_MIN (-170141183460469231731687303715884105727i128 - 1) /* maximum signed 128 bit value */ #define _I128_MAX 170141183460469231731687303715884105727i128 /* maximum unsigned 128 bit value */ #define _UI128_MAX 0xffffffffffffffffffffffffffffffffui128 #endif #ifndef SIZE_MAX #ifdef _WIN64 #define SIZE_MAX _UI64_MAX #else #define SIZE_MAX UINT_MAX #endif #endif #if __STDC_WANT_SECURE_LIB__ /* While waiting to the C standard committee to finalize the decision on RSIZE_MAX and rsize_t, * we define RSIZE_MAX as SIZE_MAX */ #ifndef RSIZE_MAX #define RSIZE_MAX SIZE_MAX #endif #endif #ifdef _POSIX_ #define _POSIX_ARG_MAX 4096 #define _POSIX_CHILD_MAX 6 #define _POSIX_LINK_MAX 8 #define _POSIX_MAX_CANON 255 #define _POSIX_MAX_INPUT 255 #define _POSIX_NAME_MAX 14 #define _POSIX_NGROUPS_MAX 0 #define _POSIX_OPEN_MAX 16 #define _POSIX_PATH_MAX 255 #define _POSIX_PIPE_BUF 512 #define _POSIX_SSIZE_MAX 32767 #define _POSIX_STREAM_MAX 8 #define _POSIX_TZNAME_MAX 3 #define ARG_MAX 14500 /* 16k heap, minus overhead */ #define LINK_MAX 1024 #define MAX_CANON _POSIX_MAX_CANON #define MAX_INPUT _POSIX_MAX_INPUT #define NAME_MAX 255 #define NGROUPS_MAX 16 #define OPEN_MAX 32 #define PATH_MAX 512 #define PIPE_BUF _POSIX_PIPE_BUF #define SSIZE_MAX _POSIX_SSIZE_MAX #define STREAM_MAX 20 #define TZNAME_MAX 10 #endif /* POSIX */ #endif /* _INC_LIMITS */
-
ifdef _POSIX_?! Was sind denn das für Anwandlungen?
Naja, ist eh egal, <limits> ist das einzig Akzeptable, ich hab climits nur der Vollständigkeit halber erwähnt
-
.filmor schrieb:
ifdef _POSIX_?! Was sind denn das für Anwandlungen?
Ja, Windows (AFAIR ab NT 5.0) hat ein Posix-Subsystem.
Greetz, Swordfish
-
Ach ja, SFU, ich vergaß. Ist aber Myll das Ding.
-
ifdef _POSIX_?! Was sind denn das für Anwandlungen?
<limits> ist das einzig Akzeptable, ich hab climits nur der Vollständigkeit halber erwähnt
Die Grenzen, die ich aufzeigen wollte, sind aber mal in der Datei limits.h. Von Headern habe ich oben übrigens nicht gesprochen.
limits führt zu climits, und dieses wiederum zu limits.h.// limits standard header #pragma once #ifndef _LIMITS_ #define _LIMITS_ #ifndef RC_INVOKED #include <ymath.h> #include <cfloat> #include <climits> //<--- !!! #include <cmath> #include <cwchar> #include <xstddef> //...
Fazit:
limits verwendet #include <climits>
climits verwendet #include <limits.h>Also bildet limits.h einen wichtigen Bestandteil von C++!
Das ist nicht irgend ein alter Käse, sondern mitten drinnen in C++, schön gekapselt!
-
Ich könnte mit dir wetten, dass das im Standard nicht vorgeschrieben ist.
Und oh, welch Wunder, mein g++ macht es tatsächlich anders :p.
-
hmmm, also lesen wir den C++-Standard und schauen, ob dieser "limits.h" überhaupt erwähnt, und in der Tat diese Datei limits.h existiert im Standard an zwei Stellen:
a) 18.2.2.: <climits> ... The contents are the same as the Standard C library header <limits.h>
b) Annex D, D5: Standard C library headersAnsonsten hat filmor. aber Recht:
The C++ Standard Library provides 32 C++ headers, as shown in Table 11: Table 11—C++ Library Headers <algorithm> <iomanip> <list> <ostream> <streambuf><bitset> <ios> <locale> <queue> <string><complex> <iosfwd> <map> <set> <typeinfo> <deque> <iostream> <memory> <sstream> <utility><exception> <istream> <new> <stack> <valarray><fstream> <iterator> <numeric> <stdexcept> <vector> <functional> <limits> The facilities of the Standard C Library are provided in 18 additional headers, as shown in Table 12: Table 12—C++ Headers for C Library Facilities <cassert> <ciso646> <csetjmp> <cstdio> <ctime><cctype> <climits> <csignal> <cstdlib> <cwchar><cerrno> <clocale> <cstdarg> <cstring> <cwctype> <cfloat> <cmath> <cstddef>