PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C: typisierte ganzzahlkonstanten.


MadMan2k
2006-02-13, 13:54:40
ich verstehe irgendwie den sinn hinter typisierten Ganzzahlokonstanten nicht.
was ist der Untnerschied ob ich 30, 30U oder 30L schreibe?

Coda
2006-02-13, 14:01:14
#include <iostream>

void test(signed int a)
{
std::cout << "signed" << std::endl;
}

void test(unsigned int a)
{
std::cout << "unsigned" << std::endl;
}

int main()
{
test(10);
test(10U);
}Edit: Ach so, das ist ja nur in C++ möglich... Sorry...

Trap
2006-02-13, 14:08:44
ich verstehe irgendwie den sinn hinter typisierten Ganzzahlokonstanten nicht.
Erstmal gibt es Werte die nur mit angegebenem Typ gültig sind.

Dann macht es noch einen Unterschied wenn man mit den Literalen rechnet bevor man sie irgendeiner Variablen zuweist.

MadMan2k
2006-02-13, 14:36:35
also konkret bin ich über folgende stelle gestolpert:


int degree; //-360..360
long enc_count;
enc_count=abs(degree)*0166L;
enc_count /= 0360L;


man könnte das ganze doch so vereinfachen:

int degree;
long enc_count= abs(degree) * 166/360;
//oder gleich
int enc_count= abs(degree) * 166/360;

zeckensack
2006-02-13, 15:10:46
#include <stdio.h>

int
main()
{
int peter=~0>>28;
int klaus=~0u>>28;

printf("peter=%d\n",peter);
printf("klaus=%d\n",klaus);

return(0);
}

zeckensack
2006-02-13, 15:14:11
also konkret bin ich über folgende stelle gestolpert:


int degree; //-360..360
long enc_count;
enc_count=abs(degree)*0166L;
enc_count /= 0360L;
Die konkrete Stelle ist Müll. Die Suffixe sind in mehrfacher Hinsicht überflüssig, und wer Zahlen oktal notiert gehört schnellstmöglich erschossen.

Xmas
2006-02-13, 15:18:25
Kann es sein dass hier jemand davon ausgegangen ist dass int 16 Bit breit ist? Bei 360 * 118 kommt man schon in den Bereich den man bei 16 Bit nur noch unsigned darstellen kann. Oder aber es gibt keine Garantie, dass degree zwischen -360 und 360 liegt. Noch weniger verständlich ist für mich, warum hier oktale Integerliterale verwendet werden...

MadMan2k
2006-02-13, 16:56:32
ok, danke schonmal

aber wie ich das sehe braucht man abgesehen von bitoperationen keine suffixe verwenden solange man sich im dezimalsystem verwendet.
oder schneidet der compiler zu große zahlen ab, wenn sie nicht als long deklariert sind?

Expandable
2006-02-13, 18:12:36
oder schneidet der compiler zu große zahlen ab, wenn sie nicht als long deklariert sind?

Wenn eine Zahl zu groß ist für ein int/short (oder auch long, was bei mir aber das selbe wie int ist, wenn ich mich richtig erinnere), ist nicht definiert, was passiert. Die meisten werden dann wohl wieder von unten anfangen zu zählen (also wenn die min. Zahl 0 und die max. Zahl 100 ist und Du schreibst 110 hin, steht letztlich 10 drin). Ein guter Compiler sollte auf jeden Fall eine Warnung ausspucken.

Vor dem "Abschneiden" schützt Dich aber ein long auch nicht. Versuch doch mal 30! in einem __int64 zu speichern, wird nicht hinhaun! Die Zahlen sind einfach zu groß, um noch in einem eingebauten C(++)-Datentyp gespeichert zu werden.