1

Téma: [vyřešeno] Špatné vyhodnocení podmínky if

Podmínka vyhodnotí správně jen hodnotu do velikosti "signed int". Při použití proměnné "unsigned int" nebo "uint64_t " a vložení vyšší hodnoty čísla to vyhodnotí špatně. Je to vlastnost FULL-C ?

void main(void) {
    uint64_t x, y;

    x = 4294907296;
    y = 5000;
    
    if(x > y) {
        printf("OK");    
    } else {
        printf("Tady by to nemelo dojit!!");        
    }
}

Výstupem je text "Tady by to nemelo dojit!!".

2

Re: [vyřešeno] Špatné vyhodnocení podmínky if

void main(void) 
{
    uint64_t x, y;

    // zadávat lze jen 32bit konstanty (x = konst), ale pak už pro práci s (u)int64 jiná omezení nejsou. Takže:
    unsigned int xx;
    xx = 4294907296; // samozřejmě max 32bit - pokud to má být více je postup složitější viz wiki
    x = xx;

    y = 5000;

    printf("x=%u y=%un",x,y);

    if(x > y)
    {
        printf("OK");
    } else 
    {
        printf("Tady by to nemelo dojit!!");
    }
}

viz: http://wiki.merenienergie.cz/index.php/FULL-C_64bit (zejména poslední část na konci)

Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !

3

Re: [vyřešeno] Špatné vyhodnocení podmínky if

A tohle?

void main(void) {
    unsigned int x, y;

    x = 2147483647;
    y = 5000;
    
    printf("x=%u|%d, y=%un", x, x, y);
    
    x = x *2;
    printf("x=%u|%d, y=%un", x, x, y);
    
    if(x > y) {
        printf("OK");    
    } else {
        printf("Tady by to nemelo dojit!!");        
    }
}

Výstup je:

x=2147483647|2147483647, y=5000
x=4294967294|-2, y=5000
Tady by to nemelo dojit!!

4

Re: [vyřešeno] Špatné vyhodnocení podmínky if

ano tohle vypadá že už je chybné
(navíc teď je ten 64bit mimo hru)

zejména když

printf("x=%x y=%x %u", x, y, (x>y));


x=fffffffe y=1388 0
Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !

5

Re: [vyřešeno] Špatné vyhodnocení podmínky if

adamn napsal:

ano tohle vypadá že už je chybné
(navíc teď je ten 64bit mimo hru)

Ano, momentálně se jedná o "unisgned int". 64bit mě nefungoval také, ale ten problém byl jinde - viz. odkaz na wiki.

6

Re: [vyřešeno] Špatné vyhodnocení podmínky if

Vyzkoušejte nový firmware, je to tam vyřešené.

Chybně se to uvnitř převádělo, v některých případech, na signed int a pak ty podmínky měly špatný výsledek.
Nalezeno, opraveno, otestováno.

Pozor však nenachytejte se na použití if pro signed/unsigned, tam se to podle C standardu musí vždy převést obojí na unsigned !
Pokud chcete porovnávat jeden z parametrů který je signed, musíte pro správné provedení mít i všechny ostatní proměnné co tam vstupují jako signed.
Ale toto je jen poznámka na okraj, původní nahlášená chyba s if byla skutečná, a je opravena.

Poznámky k 64bit proměnným viz wiki, tam změna není.

Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !

7 Naposledy upravil: dockys (2021-03-26 12:41:40)

Re: [vyřešeno] Špatné vyhodnocení podmínky if

Díky za rychlou úpravu, vyzkouším a otestuju.
Ty 64bit jsou v pohodě, návod na wiki je dostatečný...