2013-07-04 16 views

Odpowiedz

9

Operand z jednoargumentowego minusu najpierw podlega standardowym zapowiedziom, więc jest typu int, który może reprezentować wartość -128. Rezultatem operacji jest wartość 128, również typu int. Konwersja z int na signed char, będącą zawężeniem typów podpisów, jest definiowana przez implementację.

(Twój realizacja wydaje się zrobić prosty wrap-around: 125, 126, 127, -128, -127, ...)

+0

Czy ANSI C do konwertowania prymitywne typy int ** ** Przed wykonaniem arytmetyczna operacje? Dotyczy to Javy (jako stanów Java lang spec), ale czy to prawda dla C? – gavenkoa

+0

@gavenkoa Może być odpowiedź: [C 2011 (n1570) 6.3.1.8 ("Zwykłe konwersje arytmetyczne") 1 stwierdza, że ​​promocje całkowite są wykonywane przed rozważeniem, czy typy są takie same:] (http://stackoverflow.com/questions/12841278/char-and-the-usual-arithmetic-conversion-rules) –

+0

@gavenkoa: Mówiąc wprost, wszystko, co jest "mniejsze" niż "int", jest promowane do 'int' podczas operacji arytmetycznych. Wynik jest następnie przypisany z powrotem do lewej strony. –

4

Uwaga: -128 w uzupełnieniu do 2 jest 1000 0000 (w jednym bajcie) i 128 jest również 1000 0000. Jeśli nie char c = 128 i wydrukować go będzie -128 powodu następującego powodu:

Zmienna char = 128 przechowuje wartości w pamięci w następujący sposób.

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

Teraz

  1. tej wartości będą interpretowane jako wartość ujemną z powodu MSB jest 1,
  2. wydrukować wielkości tego ve numer 2 za uzupełnienie potrzebne, to również 128 w jednym bajt więc wyjście jest: -128

    2 uzupełnienie:

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

ponieważ bajt (char) nie może pomieścić 128

-128 = 0x80 

co neg zrobić, to odwrócić go i plus 1

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

daha, masz znowu

0x80