2013-07-04 21 views

cevap

9

Unary eksi işleneni ilk kez standart taahhütlere tabi tutulur, bu nedenledeğerini temsil eden int tipindedir. İşlemin sonucu, int türünde 128 değeridir. İmzalanan tiplerin daralması olan int - signed char arasındaki dönüşüm, uygulama tanımlıdır.

(Kişisel uygulanması basit bir wrap-around yapmak görünüyor: 125, 126, 127, -128, -127, ...)

+0

mu ANSI C ilkel türleri dönüştürmek için ** int ** önce performans aritmetik operasyonlar? Bu Java için geçerlidir (Java lang spekleri olarak), fakat C için bu doğru mu? – gavenkoa

+0

@gavenkoa Cevabınız olabilir: [C 2011 (n1570) 6.3.1.8 (“Her zamanki aritmetik dönüşümler”) 1, tamsayı promosyonlarının türlerin aynı olup olmadığını düşünmeden yapıldığını belirtir:] (http://stackoverflow.com/questions/12841278/char-and-the-olağan-aritmetik dönüşüm-kuralları) –

+0

@gavenkoa: Basitçe, “int” den “küçük” olan her şey aritmetik işlemler sırasında “int” olarak tanıtılır. Sonuç daha sonra sol tarafa geri atanır. –

4

Not: 2'nin tamamlayıcı -1281000 0000 (bayt birinde) ve 128 da 1000 0000 olmasıdır. Eğer char c = 128 yapmak ve yazdırmak Eğer o, şu nedenden dolayı -128 olacaktır:

bir karakter değişkeni = 128 değeri saklar bellekte şöyle. MSB 1 çünkü

  1. bu değeri negatif değer olarak yorumlanacaktır Şimdi

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

    ,

  2. gerekli bu -ve sayı 2'nin tamamlayıcı büyüklüğünü yazdırmak için, o da 128 birdir çıkış böylece bayt geçerli: -128

    2'ye tümleyen:

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

bir bayt (karakter) 128

-128 = 0x80 
yapmak bunu tersine ne neg

ve artı 1

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

daha, tutamayacak, çünkü var yine

0x80