Mam wątpliwości z poniższych 2 fragmentów kodu.Przepełnienie danych przy porównywaniu wartości
Uruchomiłem ten kod na maszynie 64-bitowej (x86_64-linux-gnu). Widzę przepełnienie wartości Val
, gdy typem danych jest unsigned integer
.
#include<stdio.h>
main()
{
unsigned int Val = 0xFFFFFFFF-15, Val2 = 0xFFFFFFFF;
if (Val+16 < Val2)
{
printf("Val is less than Val2\n");
}
}
Jeśli typ danych to unsigned char
, to nie powoduje przepełnienia.
#include<stdio.h>
main()
{
unsigned char Val = 0xFF-15, Val2 = 0xFF;
if (Val+16 < Val2)
{
printf("Val is less than Val2\n");
}
}
Mam dwa pytania:
- Czy wartość
Val
awansować na wysokie typu danych, gdy typ danych jest unsigned char?- Jeśli tak, dlaczego nie został awansowany z 32-bitowego na 64-bitowy
unsigned long
?
To nie są lata 90-te - obecnie wymagany jest typ zwracania na 'main'. – InternetAussie
Gdy arytmetyka, wszystko jest promowane do "int", jeśli można dopasować, lub do "unsigned int", jeśli nie może. Rozmiar tych typów jest specyficzny dla kompilatora i można go łatwo znaleźć. –