2011-07-02 16 views
7
main() 
{ 
    unsigned x=1; 
    char y=-1; 

    if(x>y) 
      printf("x>y"); 
    else 
     printf("x<=y"); 
} 

Beklediğim x> y. ancak imzasız int'yi int olarak değiştirdiğimde, beklenen sonuçları aldım.Niçin imzasız bir int 1 bir char y -1'den daha düşük?

+0

char y = -1; bir hata atmalıyım diye düşünüyorum. char y = '- 1' yerine – Devjosh

+0

@ Devjosh, hayır yanılıyorsunuz. '-1' geçerli bir karakter değil. – taskinoor

+0

@Devjosh: '' -1 '' bir uyarı atar çünkü aslında '' '' ve '' 1 '' birleştirildi, sayı "-1" değil. İkincisi göz ardı edilir. – Lekensteyn

cevap

11

char Eğer signed char eşdeğerdir:

  • charint yana int (Tamsayı Tanıtımlar ISO C99 §6.3.1.1 ¶2)
  • terfi ve unsigned aynı dereceye sahip, int dönüştürülür unsigned (Aritmetik Dönüşümler, ISO C99 §6.3.1.8)

charunsigned char eşdeğerdir:

  • charint veya unsigned int ya terfi edilebilir: (tipik olarak, çünkü sizeof(int) > sizeof(char)) her unsigned char değerleri temsil edebilir
    • int ise, charint dönüştürülür. Aksi halde (genellikle sizeof(char)==sizeof(int), char) unsigned'a dönüştürülür.
  • Şimdi int veya unsigned ve unsigned olduğunu başka birini olduğu bir işlenen var. İlk işlenen, unsigned'a dönüştürülür.

Tamsayı promosyonlar: int aksi unsigned için, orijinal modeli tüm değerlerini tutabilir eğer intint dönüştürülür o alt kademedeki bir tür bir ifade.

Aritmetik dönüşümler: Daha büyük bir alana dönüştürmeyi deneyin. İmzalı ve imzasız arasında çakışma olduğunda, daha büyükse (iki türün aynı sıralamaya sahip olması durumunda) işaretsizse, imzasız olarak ilerleyin. Aksi takdirde, her iki türün de tüm değerlerini gösterebileceği durumlarda yalnızca imzalı olarak ilerleyin. işaretsiz bir tamsayı türüne dışı bir aralık değerinin

Dönüşüm etrafı sarılan (modüler aritmetik) ile yapılır:

Dönüşüm tipleri (ISO C99 §6.3.1.3) tamsayı.

Aralık dışı bir değerin imzalı bir tamsayı türüne dönüştürülmesi, uygulamanın tanımlanmasıdır ve bir sinyali artırabilir (SIGFPE gibi).

+0

Düzenlendi: uyku eksikliği nedeniyle zihinsel atlamalı. – ninjalj

+1

+ 1 ayrıntılı ve doğru cevap. (Ve kabul edilen cevap yanlış olduğunda neredeyse her zaman +1 doğru cevaplar verdiğim için.) –

4

İmzalı ve imzasız olarak tek bir işlemde kullanıldığında, imzalı olarak C'nin otomatik tür dönüşümü ile imzasız olarak yükseltilmiştir. -1'un bit pateni imzasız bir sayı olarak kabul edilirse, o zaman çok yüksek bir değerdir. Yani x > y yanlıştır.

+1

@taskinoor: -1'in bit modelinin ne “unsigned number” olarak kabul edildiğinin bir önemi yoktur, imzasız bir türe dönüştürüldüğünde önemli olan _value_. –

+0

@Charles Bailey, demek istediğim buydu. Benim dilim yeterli olmayabilir. – taskinoor

+3

@taskinoor: -1'in bit kalıbı hakkında konuştuğunuzda, “char” dan “unsigned” in örtülü tanıtımının, uygulamada bir “char” ın temsili temsiline bağlı olduğunu ima ettiniz. İkili tamamlayıcı) doğru değil. –

İlgili konular