2013-07-04 6 views

Répondre

9

L'opérande de l'unaire moins subit d'abord des promotions standard, il est donc de type int, ce qui peut représenter la valeur -128. Le résultat de l'opération est la valeur 128, également de type int. La conversion de int à signed char, étant un rétrécissement des types signés, est définie par l'implémentation.

(Votre mise en œuvre semble faire un simple enveloppant: 125, 126, 127, -128, -127, ...)

+0

Est-ce que la norme ANSI C convertir les types primitifs ** int ** avant d'effectuer arithmétique opérations? Cela est vrai pour Java (en tant qu'états Java lang spec), mais est-ce vrai pour C? – gavenkoa

+0

@gavenkoa Peut être votre réponse: [C 2011 (n1570) 6.3.1.8 ("Conversions arithmétiques usuelles") 1 indique que les promotions entières sont effectuées avant de considérer si les types sont les mêmes:] (http://stackoverflow.com/questions/12841278/char-and-the-habituel-arithmetic-conversion-rules) –

+0

@gavenkoa: En gros, tout ce qui est "plus petit" qu'un int est promu en int pendant les opérations arithmétiques. Le résultat est ensuite attribué de nouveau sur le côté gauche. –

4

Note: -128 en complément de 2 est 1000 0000 (dans un octet) et 128 est également 1000 0000. Si vous faites char c = 128 et l'imprimez, ce sera -128 pour la raison suivante:

Une variable char = 128 valeur stocke dans la mémoire comme suit.

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

Maintenant,

  1. cette valeur sera interprété comme valeur négative car MSB est 1,
  2. pour imprimer l'ampleur de ce nombre -ve 2 du complément nécessaire, qui est aussi 128 dans un octet si la sortie est la suivante: -128

    complément à 2:

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

parce qu'un octet (char) ne peut contenir 128

-128 = 0x80 

ce neg faire est inverse et plus de 1

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

Daha, vous avez à nouveau 0x80

Questions connexes