Wpis z mikrobloga

uint32t a,b;
uint64
t c;

a = UINTMAX;
b = UINT
MAX;

c = a + b;
printf("a: %u, b: %u, c: %llu\n", a, b, c);

c = (uint64t)a + (uint64t)b;
printf("a: %u, b: %u, c: %llu\n", a, b, c);

wynik:

a: 4294967295, b: 4294967295, c: 4294967294
a: 4294967295, b: 4294967295, c: 8589934590

Ech... Domyslna konwersja wyniku do int (32 bity).

#jezykc, #programowanie
  • 8
W sumie... to mnie to nie dziwi. Starczy zrozumieć co tu zachodzi. Zapis c = a + b; rozważany jest przez kompilator jako 2 osobne kroki:
1. a+b
2. c=[wynik z 1]
Ponieważ na poziomie kroku 1 kompilator "widzi" tylko 2 wartości 32-bitowe, całość traktuje jako 32-bitową.
@NevilX: jak patrzysz na taki przyklad to jest to raczej oczywiste. Ale jak masz do czynienia z bugiem tego typu w dosc obszernym kodzie, to jest troche gorzej. Wlasnie przerabialem to drugie w kodzie klienta tftp :(