bin verwirrt wegen typen usw
-
hallo
nach langem suchen habe ich einen fehler auf diesen codeabschnitt (nachgestellt) eingrenzen können:
#include <iostream> template<typename Lhs, typename Rhs> struct Match { static const bool Value = false; }; template<typename T> struct Match<T, T> { static const bool Value = true; }; template<typename T> struct IsUS { static const bool Value = Match<T, unsigned short int>::Value; }; template<typename T> struct IsUL { static const bool Value = Match<T, unsigned long int>::Value; }; template<typename T> struct IsSS { static const bool Value = Match<T, signed short int>::Value; }; template<typename T> struct IsSL { static const bool Value = Match<T, signed long int>::Value; }; template<typename T> struct IsInt { static const bool Value = IsUS<T>::Value || IsUL<T>::Value || IsSS<T>::Value || IsSL<T>::Value; }; int main() { std::cout << std::boolalpha; std::cout << IsInt<int>::Value; }output:
falselink: http://ideone.com/5uH74D
wieso ist das so? ein int muss ja entweder us, ul, ss oder sl sein also muss das doch irgendwo true sein...
gruss
-
asdfsdf schrieb:
wieso ist das so? ein int muss ja entweder us, ul, ss oder sl sein also muss das doch irgendwo true sein...
Nein, wie kommst du da drauf? Selbst char und signed/unsigned char sind schon verschiedene Typen, aber int und short bzw. long haben doch völlig andere Wertebereiche, wie sollten die jemals gleich sein? Wenn du signed int schreibst, sollte dieser gleich int sein.
-
das mit char / unsigned char / signed char wusste ich. aber dass das bei int auch so ist? ich meine mal gelesen zu haben dass int immer entweder long int oder short int ist.
da ich auf einer kleinen suche eben leider nichts entsprechendes gefunden habe, nehme ich das fortan einfach so hin. dass int aber immer entweder signed int oder unsigned int ist (und halt dessen entsprechung für die anderen grössen (also short int = unsigned short int oder signed short int)) stimmt, sagst du?man lernt jeden tag etwas neues in dieser sprache.

-
okay ich habe es eben implementiert und du hattest natürlich recht. nun funktioniert alles einwandfrei. danke.
-
asdfsdf schrieb:
ich meine mal gelesen zu haben dass int immer entweder long int oder short int ist.
Dann hast du dich falsch erinnert, verlesen oder die die Quelle lügt.
Beispiel: Auf 64-Bit Linux ist long 64-Bit und int 32-Bit. short bleibt bei 16-Bit
Es ist auch möglich, dass alle gleich groß sind.
-
asdfsdf schrieb:
dass int aber immer entweder signed int oder unsigned int ist (und halt dessen entsprechung für die anderen grössen (also short int = unsigned short int oder signed short int)) stimmt, sagst du?
int ist immer signed int. Punkt. Aus. Keine Ausnahmen.
short = short int = signed short int
unsigned short = unsigned short int
int = signed int
unsigned = unsigned int
long = long int = signed short int
unsigned long = unsigned long intErkennst du das System? Ich habe den Eindruck, dass deine ganze Verwirrung aus dem char/signed char/unsigned char kommt. Das ist nur bei char so, dass einfach nur "char" sowohl signed oder unsigned sein kann. Und das es als ein eigener Typ gilt.
-
SeppJ schrieb:
asdfsdf schrieb:
dass int aber immer entweder signed int oder unsigned int ist (und halt dessen entsprechung für die anderen grössen (also short int = unsigned short int oder signed short int)) stimmt, sagst du?
int ist immer signed int. Punkt. Aus. Keine Ausnahmen.
short = short int = signed short int
unsigned short = unsigned short int
int = signed int
unsigned = unsigned int
long = long int = signed short int
unsigned long = unsigned long intErkennst du das System?
abgesehen von der zweituntersten zeile in deiner aufzählung (flüchtigkeitsfehler ;)), ja.
SeppJ schrieb:
Ich habe den Eindruck, dass deine ganze Verwirrung aus dem char/signed char/unsigned char kommt. Das ist nur bei char so, dass einfach nur "char" sowohl signed oder unsigned sein kann. Und das es als ein eigener Typ gilt.
das kann gut sein und wird wahrscheinlich - zusammen damit, dass ich mich mal verlesen habe (wie oben einmal erwähnt) - mein problem gewesen sein, ja. also ich merke es mir nun so:
char kann 1 grösse und 3 vorzeichentypen haben. wobei char keine aliase hat. (3 weil char ja weder unsigned char noch signed char ist)
int kann 3 grössen und 2 vorzeichentypen haben. wobei int signed int als alias hat.
-
Ich würde an deiner Stelle short, int und long als vollständig eigenständige Typen ansehen, nicht als Abwandlungen von int.
-
siehe auch ISO/IEC 14882:2011 Table 10 — simple-type-specifiers and the types they specify
Specifier(s) Type
type-name the type named
simple-template-id the type as defined in 14.2
char “char”
unsigned char “unsigned char”
signed char “signed char”
char16_t “char16_t”
char32_t “char32_t”
bool “bool”
unsigned “unsigned int”
unsigned int “unsigned int”
signed “int”
signed int “int”
int “int”
unsigned short int “unsigned short int”
unsigned short “unsigned short int”
unsigned long int “unsigned long int”
unsigned long “unsigned long int”
unsigned long long int “unsigned long long int”
unsigned long long “unsigned long long int”
signed long int “long int”
signed long “long int”
signed long long int “long long int”
signed long long “long long int”
long long int “long long int”
long long “long long int”
long int “long int”
long “long int”
signed short int “short int”
signed short “short int”
short int “short int”
short “short int”
wchar_t “wchar_t”
float “float”
double “double”
long double “long double”
void “void”
auto placeholder for a type to be deduced
decltype(expression) the type as defined below