main() {
if (-1 < (unsigned char) 1)
printf("less than");
else
printf("NOT less than");
}
Stampe less than
. Perché, (unsigned char) 1
viene convertito in(signed char) 1
e quindi: (signed) -1 < (signed) 1
, pertanto l'output è less than
.Promozioni dei tipi di dati durante operazioni aritmetiche: -1 <(unsinged int) 1 == false
Ma se cambio il codice qui sopra-if ((-1 < (unsigned int) 1)
allora l'uscita è NOT less than
.
Quindi è ovvio che quando cambio unsigned char a unsigned int:
- (firmato) -1 viene convertito in unsigned int [esattamente opposto sta accadendo]
- dal -1 è memorizzato come complimento 2 di di 1; il bit-pattern è valutato come 255 (probabilmente)
- quindi 255 < 1 valuterà su falso e altro verrà eseguito.
- anche se si sostituisce
int a = -1;
al posto di '-1' stesso risultato
Domande:
durante l'aritmetica firmato e non firmato ... come essere sicuri se firmato saranno convertiti in non firmato o viceversa.
perché è la conversione diverso per aritmetica tra unsigned char e char: a quanto pare unsigned viene convertito firmato e unsigned int e int: a quanto pare firmato è convertitore di unsigned
PS: So che questo non è compilatore dipendente ... quindi non dire che lo è.
non sono tutti letterali standard int? (char unsigned - int promozione vs int -> promozione unsigned int) – flownt