• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Wertebereich und Datentyp

Lucky07

Newbie
Hallo zusammen,

wie bekomme ich den Datentyp heraus wenn der Wertebreich beispielsweise 0.......6*10 hoch5 ist ???

Kann mir da jemand auf die Sprünge helfen ? :D
 

spoensche

Moderator
Teammitglied
In dem du die Datentypen für Zahlen vergleichst oder nachsiehst, welchen Wertebereich der Datentyp hat.In deinem Fall dürfte das ein vorzeichenbehafteter Integer sein.
Welche Programmiersprache?
 
OP
L

Lucky07

Newbie
objektorientierte Programmierung mit C++

hab ich das richtig verstanden das dann beispielsweise der Wertebereich 0.233546676....1 der Datentyp double ist ??

bzw. der Wertebereich 0.....4*10 hoch9 float ist ??
 

Wizzzard

Member
Nein, hast Du nicht.

Die Zahlentypen float und double unterscheiden sich in der Anzahl der Bits für die Mantisse und den Exponent. Die Mantisse bestimmt quasi wie viele Nachkommastellen man hat, während die Bits im Exponent im großen und ganzen den Wertebereich bestimmen. Da double mehr Bits hat als float ist der gesamte Wertebebereich von float in double enthalten.
 

abgdf

Guru
Einen gewissen Anhaltspunkt könnte vielleicht auch sizeof() geben:
Code:
#include <stdio.h>

int main(void)
{
    unsigned long int a = 12345;
    signed long int b = 12345;
    unsigned short int c = 123;
    signed short int d = 123;

    float e = 1.3;
    double f = 1.43;

    printf("%d\n", sizeof(a));
    printf("%d\n", sizeof(b));
    printf("%d\n", sizeof(c));
    printf("%d\n", sizeof(d));
    printf("%d\n", sizeof(e));
    printf("%d\n", sizeof(f));


    return 0;
}
Leider nicht eindeutig ... Bin auch kein C/C++-Experte.

In "meiner" Sprache Python gibt's ja "type()" für den "Datentyp" eines Objekts. Vielleicht gibt's in C++ was Vergleichbares :???: ...

Woher kennst Du eigentlich den Wertebereich der Variablen ?

Gruß
 
OP
L

Lucky07

Newbie
...ich habe angefangen C++ zu lernen und da muss ich mich halt auch mit den Wertebereichen und Datentypen auseinandersetzen.....
 

panamajo

Guru
Code:
#include <stdio.h>
#include <values.h>

int main (void)
{
	printf("float min: %f\n", MINFLOAT);
	printf("float max: %f\n", MAXFLOAT);
	printf("float min exp: %d\n", FMINEXP);
	printf("float max exp: %d\n", FMAXEXP);

	printf("double min: %f\n", MINDOUBLE);
	printf("double max: %f\n", MAXDOUBLE);
	printf("double min exp: %d\n", DMINEXP);
	printf("double max exp: %d\n", DMAXEXP);


	return(0);
}
 
OP
L

Lucky07

Newbie
...hm...ihr meint also wenn ich einen best. Wertebereich habe, von sagen wir mal -5......33000, dann kann ich mit sizeof () den geeigneten Datentyp ermitteln .

cout << sizeof(short)<< '\n';

(sorry, wenn ich irgdenwie blöd frage, aber ich möchte es schon richtig lernen... ;) )
 

abgdf

Guru
Hallo,

hab' nochmal darüber nachgedacht: Also, ich glaube, zumindest in C dürfte das Problem gar nicht auftreten, weil der Datentyp immer explizit angegeben werden muß.
Ich habe mal versucht, eine Funktion zu schreiben, die versucht, den Datentyp einer Variable zu ermitteln. Das ging schon deshalb nicht, weil ich der Funktion gar keine Variable eines unbekannten (und herauszufindenden) Datentyps übergeben konnte. Der zu übergebende Datentyp muß ja schon in der Funktionsdeklaration vom Programmierer angegeben werden. Das C-Programm weiß deshalb immer, womit es es zu tun hat.
Hatte noch an "Zeiger auf void" gedacht, aber das geht anscheinend auch nicht.
Das Problem dürfte also eher theoretisch sein.

Gruß
 

panamajo

Guru
Lucky07 schrieb:
...hm...ihr meint also wenn ich einen best. Wertebereich habe, von sagen wir mal -5......33000, dann kann ich mit sizeof () den geeigneten Datentyp ermitteln .
Nein, sizeof() liefert die Anzahl Bytes für eine angegebene Variable oder Typdefinition.

Wie abgdf richtig schrieb ist in C/C++ durch die strenge Typisierung nicht sinnvoll den Typ einer Variable an Hand des aktuellen Wertes zu variieren.

Außerdem sind Überlegungen bzgl. Wertebereich bei Fließkommawerte sowieso eine Sache für sich, exakt abgebildet werden nur Vielfache von 2er Potenzen...
 
OP
L

Lucky07

Newbie
...ich hab hier nämlich eine Aufgabe in der verschiedene Wertebereiche dargestellt sind und nun muss ich eben den kleinst möglichen Datentyp verwenden

Bsp: Wertebereich Datentyp

0.233566876.......1 ?

A.......G ?

0.......6*10hoch5 ? usw. usw
 

abgdf

Guru
Ok, die Wertebereiche sind also in der Aufgabenstellung vorgegeben, und DU sollst einen passenden Datentyp finden.
Dann lies doch bitte z.B.

http://icem-www.folkwang-hochschule.de/~neuhaus/musikinformatik/node47.html
http://icem-www.folkwang-hochschule.de/~neuhaus/musikinformatik/node48.html

sowie

http://www.space.unibe.ch/comp_doc/c_manual/C/CONCEPT/data_types.html

Dort am Ende ist eine Tabelle. Da kannst Du den passenden Datentyp heraussuchen.

Gruß
 

abgdf

Guru
Hallo,

noch etwas Interessantes / Seltsames.

Erstmal @Lucky07: : Ein "unsigned long int" belegt (auf meinem System) 4 Bytes (-> sizeof), also 32 Bits. Wie sich die 32 Werte der (gesetzten) Bits verteilen, habe ich mal in einem Perl-Skript dargestellt:
Code:
#!/usr/bin/perl

use warnings;
use strict; 

my $a = 0; 
my $x = 1; 
my $i;

print "Binary " . '"' . "1" x 32 . '" (32 digits):'. "\n\n"; 

print "Bit-Nr. \t Bit-Value if set \t Accumulated result\n";

foreach $i (1 .. 32) {
    $a += $x;
    print 33 - $i ." \t\t $x \t\t\t $a\n";
    $x = $x * 2;
}
Demnach müßte der höchste Wert, der in einem "unsigned long int" gespeichert werden kann, 4294967295 betragen:
Code:
perl -e 'print 0xFFFFFFFF ."\n";'
Weist man in C aber so einer Variablen einen solchen Wert zu, bekommt man von gcc folgende Meldung:
warning: this decimal constant is unsigned only in ISO C90
Und mit folgendem C-Code
Code:
#include <stdio.h>

int main(void)
{
    unsigned long int a = 2147483647;
    a++;    
    printf("%d\n", a);
    return 0;
}
erhält man "-2147483648". Ein "unsigned" überschlägt sich zu einem negativen Wert? Sehr merkwürdig. C/C++ mal wieder. Ich komm' damit nicht wirklich klar :(.

Gruß

P.S.: @Lucky07: Bei einem "signed long int" wird das erste Bit für die Angabe von Plus-/Minus benötigt. Das Perl-Skript würde also bei Bit 2 in der vorletzten Zeile der Ausgabe enden, so daß hier +-2147483647 der höchstmögliche Wert wäre.
Code:
perl -e 'print 0x7FFFFFFF ."\n";'
 
OP
L

Lucky07

Newbie
Hallo @abgdf

thx für Deine (Eure) Mühe. ;) Die Aufgabe hab ich soweit gelöst aber wirklich kapiert hab ich es immer noch net. Sehr verwirrend das Ganze. Kommt es über einen Wert hinaus wird es irgendwie als "Überlauf" deklariert...... :???:
 

Tooltime

Advanced Hacker
Und solche Zeile beinhalten implizit eine Umwandlung des Datentyp:
  • unsigned long int a = 2147483647;
besser ist

  • unsigned long int a = 2147483647ul
Dann dürfte die Compilermeldung auch verschwinden.
Wenn bei Literalkonstanten kein Typ angegeben wird, so ist dieser immer int oder double, je nachdem ob es sich um eine Ganze- oder Fließkommazahl handelt.
 

abgdf

Guru
Lucky07 schrieb:
Die Aufgabe hab ich soweit gelöst aber wirklich kapiert hab ich es immer noch net.
Wenn Du noch mehr Lust hast, könntest Du mein Perl-Skript oben ja mal nach C oder C++ übersetzen. Vielleicht übt das ja noch etwas mehr. (Ist halt nur so'ne Idee.)

Gruß
 

Wizzzard

Member
Lucky07 schrieb:
Hallo zusammen,

wie bekomme ich den Datentyp heraus wenn der Wertebreich beispielsweise 0.......6*10 hoch5 ist ???

Also, es sind nur ganze Zahlen. 6*10 hoch 5 ist 600.000. Das passt in ein 'int' wenn 'int' auch 32-bit ist. Ansonsten ist das 'long'. 'int' sollte man eigentlich nicht verwenden, da dessen Wertebereich je nach System nicht eindeutig ist. Auf 16-Bit-Systemen ging 'int' nur bis 32.768.
 
OP
L

Lucky07

Newbie
....dann wäre 0.......4*10hoch 9 ein unsigned int ???? in Exponential Schreibweise wären das dann 4 000 000 000 , oder :???:
 
Oben