**Feladat**: Változók definíciója és alapvető számolások #include main () { int a, b; int c; float f; a = 10; b = 20; c = a + b; printf("c = %d \n", c); f = 70.0 / 3.0; printf("f = %f \n", f); } **Megjegyzés:** Jegyezzük meg, hogy a 10 általában minden programozási nyelvben egész számot jelent, binárisan 32 biten kódolva: 00000000 00000000 00000000 00001010 lesz. A 10.0 jelenti a double típusú lebegőpontos számot ami 64 bites és így nézne ki: 0 10000000010 0100000000000000000000000000000000000000000000000000 és a 10.0f (igen, a végére egy f betűt írunk), jelenti a float típusú lebegőpontos számot ami ugyancsak 32 bites de így néz ki binárisan: 0 10000010 01000000000000000000000. A szóközök az előjel az exponens és a mantissza tagokat választják el egymástól. Látható tehát hogy a 10 10.0 10.0f három teljesen különböző módon van értelmezve kettes számrendszerben. **f = 70.0 / 3.0;** helyett ha ezt írjuk: **f = 70 / 3;** ezért fog más eredményt adni hiszen így elvesztjük a tizedesjegyeket. **Feladat**: Hibásan számol a c nyelv??? Mi lehet a hiba? #include main () { int a = 13; int b = 3; int c; c = a / b; printf("c = %d \n", c); } **Feladat**: Az előző kódban változtassuk meg a c-t float-ra és a printf()-ben használjunk %f-et és próbáljuk ki úgy is. Segített? #include main () { int a = 13; int b = 3; float c; c = a / b; printf("c = %f \n", c); } **Feladat**: Hozzon létre egy **unsigned int** változót 2 illetve egy **int** változót -1 értékkel és végezzen összehasonlítást, hogy 2 > -1? Magyarázza meg, hogy mi történik és miért? #include main() { int a = -1; unsigned int b = 2; if ( b > a) { printf("b nagyobb, mint a"); } printf("vege"); } **Miért számol hibásan (pontatlanul) a következő kód?** #include int main() { float a = 4.20; float b = 0.25; printf("%f\n", a / b); } Nézzük meg hogyan ábrázoljuk a változókat: https://www.h-schmidt.net/FloatConverter/IEEE754.html Írjuk be a mezőbe a két értéket és figyeljük meg a hibát. Hogyan lehetne átalakítani a forráskódot, hogy pontosan 16.800000 legyen az eredmény? Magyarázzuk meg miért nem működik a (double) (a/b) típuskonverzió? **Miért számol hibásan (pontatlanul) a következő kód?** #include #define N 3 + 5 int main() { int a = 2; printf("%d\n", a * N); } Az eredménynek 2 * 8 nak kellene lennie, de 11-et ír ki, mi lehet a hiba? Az a probléma, hogy a #define nem végez műveletet, hanem egyszerűen behlyettesít, így az a * N művelet a * 3 + 5 lesz, ami a precedencia (sorrendi) szabályok miatt 6 + 5 = 11 lesz. ==== Formátum leírók ==== |**Data Type**|**Format Specifier**| |int| %d| |char| %c| |float| %f| |double| %lf| |short int| %hd| |unsigned int| %u| |long int| %li| |long long int| %lli| |unsigned long int| %lu| |unsigned long long int| %llu| |signed char| %c| |unsigned char| %c| |long double| %Lf|