Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Was passiert da ?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
23.03.2016, 13:32 Uhr
Skacet



Code:

C++:
#include <iostream>

int main(){
     int esc;

     unsigned short u_short {1};
     unsigned int u_int {1};
     unsigned long u_long {1};
     unsigned long long u_long_long {1};

     long long u_short_max = u_short-2;
     long long u_int_max = u_int-2;
     long long u_long_max = u_long-2;
     long long u_long_long_max = u_long_long-2;

     std::cout << u_short_max <<std::endl;
     std::cout << u_int_max << std::endl;
     std::cout << u_long_max << std::endl;
     std::cout << u_long_long_max << std::endl;
     std::cout << "\n\n";
     std::cout << u_short-2 <<std::endl;
     std::cout << u_int-2 << std::endl;
     std::cout << u_long-2 << std::endl;
     std::cout << u_long_long-2 << std::endl;
     std::cin >> esc;
     return 0;

}


Output: -1
4294967295
4294967295
-1


-1
4294967295
4294967295
18446744073709551615


Ich bin noch ein Anfänger und bin am ausprobieren:
Wie sind die Variablen Größen ?
Wie komme ich auf die Werte ?
Also würde mich freuen, wenn ich dazu eine Erklärung bekommen, bitte..



-----
Edit: cpp-Tags eingefügt.

Dieser Post wurde am 24.03.2016 um 13:26 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.03.2016, 21:31 Uhr
~f.-th.
Gast


Keine Ahnung ob das Verhalten deines Programms im C++ Standard eindeutig geklärt ist?

In der Praxis können da je nach Compiler oder Compilereinstellung eventuell verschiedene Ergebnisse angezeigt werden.

Die Grenzen sind dabei bei gängigen Compilern in den Bereichen 2 hoch 16, 32 oder 64 zu suchen.

Du musst dir dann überlegen wie die CPU-Register im Grenzbereich zwischen positiven und negativen Zahlen arbeiten könnten?

Hab da noch etwas zur Demo dazu:

C++:
    long long b = 1;
    for(int i = 0; i < 32; i++)
        b = 2 * b - 2;
    std::cout << "\n\n2 hoch 32 - 2: " << b << std::endl;

    for(int i = 0; i < 32; i++)
        b = 2 * b - 1;
    std::cout << "\n\n2 hoch 32 - 1: " << b << std::endl;
    std::cout << "\n\n-(2 hoch 32) - 2: " << -(b - 2) << std::endl;


Kannst da ja noch weiter damit variieren.
Sollte unter einem halbwegs aktuellen G++ Compiler laufen. Test: Win7
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
24.03.2016, 14:04 Uhr
Hans
Library Walker
(Operator)


Interessant.
Zu diesen Zeilen
C++:
     unsigned short u_short {1};
     unsigned int u_int {1};
     unsigned long u_long {1};
     unsigned long long u_long_long {1};


meldet g++:

Code:
warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]
unsigned long long u_long_long {1};
                   ^



Da ich mich mit C++ 11 noch nicht beschäftigt habe:
ist unsigned short u_short {1}; identisch mit unsigned short u_short = 1; ?
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 24.03.2016 um 14:06 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
24.03.2016, 14:53 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Ja zumindest haben die Variablen im VS 2013 Debugger dann alle den Wert 1. Gesehen habe ich das aber auch nocht nicht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
24.03.2016, 15:13 Uhr
Hans
Library Walker
(Operator)


Hi,

Zitat von Skacet:

Wie sind die Variablen Größen ?


Wenn Du damit meinst, wie gross die Zahlen maximal werden können, die eine Variable aufnehmen kann, so lautet die Antwort, das hängt vom Datenyp und vom Compiler ab. Der C++ Standard legt nur fest, dass
Code:
short <= int <= long <= long long
sein soll. Das kann im ungünstigsten Fall bedeuten, das alle Typen gleich gross sind, aber oftmals ist es so, dass
short = 16 Bit breit ist
int = 32 Bit breit ist
long = 64 Bit breit ist
long long = 64 Bit breit ist

Aber das muss nicht so sein!
Um festzustellen, wie der Compiler das genau handhabt, gibt es den header <climits>, der die jeweiligen minimalen und maximalen Werte der einzelnen Datentypen enthält. Dort sind auch Konstanten-Namen für die jeweiligen Werte definiert. Du kannst ja mal ein Programm schreiben, dass alle Werte ausgibt, also etwa:

C++:
#include <climits>
...
std::cout << "Minimaler int-Wert: " << INT_MIN << std::endl;
...


Die Namen der Konstanten findest Du in der Doku zum Compiler; - im Zweifelsfall guckst Du in der Datei <climits> selbst nach.


Zitat von Skacet:

Wie komme ich auf die Werte ?


Die Werte sind Ergebnisse von 2er-Potenzen oder liegen um eins daneben. Wenn der Typ int beispielsweise 16 Bit breit ist, dann liegen die möglichen Werte von int im Bereich von -(2 hoch 15) bis +(2 hoch 15)-1, also von -32768 bis +32767. Im Falle von unsigned int liegen die Werte von 0 bis (2 hoch 16)-1, also von 0 bis 65535.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
24.03.2016, 15:18 Uhr
Hans
Library Walker
(Operator)



Zitat von Guybrush Threepwood:
Ja zumindest haben die Variablen im VS 2013 Debugger dann alle den Wert 1. Gesehen habe ich das aber auch nocht nicht.

ah danke.
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
24.03.2016, 17:56 Uhr
Tommix




Zitat von Hans:


C++:
#include <climits>
...
std::cout << "Minimaler int-Wert: " << INT_MIN << std::endl;
...


Hans


Hallo,
das geht auch mit richtigem C++:

C++:
#include <limits>
...
std::cout << std::numeric_limits<int>::min << std::end;



Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: