int main(void) {
uint8_t x = 3;
uint8_t y = 4;
uint8_t z = 5;
uint8_t a = (x - y)/z;
uint8_t b = x - y;
printf("a is %d\n", a);
printf("b is %d\n", b);
return 0;
}
a la sortie suivante:
a is 0
b is 255
Je suppose que (3 - 4)/5
entraînerait un dépassement de (3 - 4)
comme uint8_t
est 255. Quand une étape intermédiaire comportant des nombres entiers non signés résultats dans un nombre négatif, pourquoi ne déborde-t-il pas? Dans quel format est le résultat pour (3 - 4)
stocké avant l'étape suivante / 5
se produit?
'% d' n'est pas un spécificateur de format correct pour' uint8_t'. Et oui, l'arithmétique est effectuée avec les opérandes promus à «int». Donc '(x-y)' sera évalué à '-1' et aura le type' int'. –
Quel compilateur utilisez-vous? 'gcc -Wall' donne comme sortie' a est 0 b est 255'. Et pour ces valeurs, je pourrais peut-être concocter une explication ensemble. – Yunnosch
@EugeneSh. 'uint8_t' est promu' int' quand vous l'utilisez dans un 'printf', donc' '% d '' devrait être le bon spécificateur. – mch