2013-07-04 12 views

risposta

9

L'operando di unario meno viene sottoposto prima a promesse standard, quindi è di tipo int, che può rappresentare il valore -128. Il risultato dell'operazione è il valore 128, anche di tipo int. La conversione da int a signed char, essendo un restringimento dei tipi firmati, è definita dall'implementazione.

(L'implementazione sembra di fare un semplice avvolgente: 125, 126, 127, -128, -127, ...)

+0

non ANSI C convertire tipi primitivi a ** ** int prima di eseguire aritmetica operazioni? Questo è vero per Java (come afferma Java lang spec), ma è vero per C? – gavenkoa

+0

@gavenkoa Potrebbe essere la tua risposta: [C 2011 (n1570) 6.3.1.8 ("Conversioni aritmetiche usuali") 1 afferma che le promozioni intere vengono eseguite prima di considerare se i tipi sono gli stessi:] (http://stackoverflow.com/questions/12841278/char-and-the-usual-arithmetic-conversion-rules) –

+0

@gavenkoa: In parole povere, tutto ciò che è "più piccolo" di un 'int' viene promosso a' int' durante le operazioni aritmetiche. Il risultato viene quindi assegnato nuovamente sul lato sinistro. –

4

Nota: -128 in complemento a 2 è 1000 0000 (in un byte) e 128 è anche 1000 0000. Se lo si fa char c = 128 e lo stampa sarà -128 per il seguente motivo:

Una variabile char = 128 valore memorizza come segue.

MSB 
+----+----+----+---+---+---+---+---+ 
| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 
+----+----+----+---+---+---+---+---+ 
    7 6 5 4 3 2 1 0 

Ora,

  1. questo valore viene interpretato come valore negativo, perché MSB è 1,
  2. per stampare grandezza di questo complemento ve numero 2 del necessario, che è anche 128 in uno byte di uscita è così: -128

    complemento a 2:

    1000 0000 
    
        0111 1111 1's complement 
    + 0000 0001 
    ----------- 
        1000 0000 2's complement 
    
    Magnitude = 128 
    So in one byte 128 == -128 
    
1

perché un byte (char) non può contenere 128

-128 = 0x80 

cosa neg fare è invertire e, più 1

-(-128) = (~0x80) + 1 = 0x7F + 1 = 0x80 

Daha, hai 0x80 nuovo