Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

przypisanie dużych zmiennych do małych w Keilu

mototest 22 Sie 2006 13:11 630 5
  • #1 22 Sie 2006 13:11
    mototest
    Poziom 19  

    Witam

    pojawił sie problem przy obliczeniach
    mam taki wzór :

    unsigned long test;
    unsigned int DAC;
    int liczba =1627;

    test =(liczba*1638)/1638)+2036;
    DAC=test;
    printf ("liczba=%d DAC=%u \n",liczba,DAC);

    powinno wyjść DAC = 1627+2036=3363
    a procek wylicza 2023

    i dla innych liczb wylicza głupoty :

    liczba=0 DAC=2036
    liczba=320 DAC=2036
    liczba=625 DAC=2021
    liczba=906 DAC=2022
    liczba=1152 DAC=2028
    liczba=1354 DAC=2030
    liczba=1504 DAC=2020
    liczba=1596 DAC=2032
    liczba=1627 DAC=2023


    w czym jest problem ??

    dzięki
    Bogdan

  • #2 22 Sie 2006 13:39
    przemek20
    Poziom 20  

    test =((liczba*1638)/1638)+2036;
    lub
    test =(liczba*1638)/1638+2036;

  • #3 22 Sie 2006 14:16
    zumek
    Poziom 39  

    mototest napisał:
    ...w czym jest problem ??

    Problem jest banalny , bo ...
    Code:

    int liczba=1627;
    ...
    test =((liczba*1638)/1638)+2036;
    // jak kompilator przepuścił taki zapis "test =(liczba*1638)/1638)+2036;" ??

    ... wynik mnożenia przekroczył zakres dla int (1627*1638=2665026(0x28AA42) , a na dokładkę zmienił znak.
    Ponieważ int zajmuje 15 bitów , a 16-bit jest znakiem liczby , procedura dzieląca wynik mnożenia , weźmie pod uwagę tylko 2 młodsze bajty(0xAA42) i potraktuje to jako -21950/1638 , co w wyniku da -13+2036=2023.
    Użyj rzutowania :D

    Piotrek

  • #4 22 Sie 2006 18:22
    mototest
    Poziom 19  

    Nawiasy w programie mam dobrze tutaj je źle wpisałem.
    W zasadzie problem się rozwiązał gdy wszystkie zmienne zastosowałem long, tylko że "liczba" jest brana z tablicy i gdy jest long zajmuje dużo miejsca i nie wiem czy nie spowalnia mi programu, a potrzebuje aby wykonywał się maksymalnie szybko, wydaje mi się że próbowałem rzutowania, ale nie wiem czy dobrze, daj może przykład jak byś to widział ?

  • Pomocny post
    #5 22 Sie 2006 19:38
    zumek
    Poziom 39  

    mototest napisał:

    ... daj może przykład jak byś to widział ?

    Rzutuj do takiego typu , do jakiego chcesz przypisać wynik całego działania.
    Code:

    test =(unsigned long)liczba * 1638 / 1638 + 2036; // test = 3663


    Piotrek

  • #6 22 Sie 2006 20:07
    mototest
    Poziom 19  

    rozumiem, dzięki za pomoc

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME