2013-07-04 11 views

Antwort

9

Der Operand des unären Minus unterliegt zuerst Standardversprechen, also vom Typ int, der den Wertdarstellen kann. Das Ergebnis der Operation ist der Wert 128, auch vom Typ int. Die Konvertierung von int zu signed char, die eine Eingrenzung signierter Typen darstellt, ist implementierungsdefiniert.

(Ihre Implementierung scheint eine einfache Umgriff zu tun: 125, 126, 127, -128, -127, ...)

+0

Does ANSI C konvertieren primitive Typen ** int ** vor der Durchführung arithmetischer Operationen? Dies gilt für Java (wie states Java lang spec), aber gilt das für C? – gavenkoa

+0

@gavenko Vielleicht Ihre Antwort: [C 2011 (n1570) 6.3.1.8 ("Gewöhnliche arithmetische Konvertierungen") 1 besagt, dass die ganzzahligen Promotions durchgeführt werden, bevor geprüft wird, ob die Typen gleich sind:] (http://stackoverflow.com/questions/12841278/char-and-the-ordinary-arithmetic-conversion-rules) –

+0

@gavenko: Locker gesagt, alles, was "kleiner" ist als ein "int", wird während arithmetischer Operationen zu "int" hochgestuft. Das Ergebnis wird dann wieder der linken Seite zugewiesen. –

4

Hinweis: -128 in 2-Komplement ist 1000 0000 (in einem Byte) und 128 ist auch 1000 0000. Wenn Sie char c = 128 tun und drucken wird es -128 sein, weil aus dem folgenden Grund:

A char-Variable = 128 Wert speichert im Speicher wie folgt.

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

Jetzt

  1. diesen Wert wird als negativer Wert interpretiert werden, da MSB 1 ist,
  2. benötigte Größe dieser -ve-Nummer 2-Komplement zu drucken, das ist auch 128 in einem Byte so ausgegeben wird: -128

    2-Komplement:

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

weil ein Byte (char) nicht 128

-128 = 0x80 

halten kann, was neg tun, ist es umgekehrt und zuzüglich 1

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

daha, 0x80 Sie bekam wieder