2015-08-12 22 views
6
#include <stdio.h> 
main() 
{ 
    if (sizeof(int) > -1) 
     printf("True"); 
    else 
     printf("False"); 
} 

CEVAP eğer.c dili sizeof deyimi

Neden böyle davranıyor?

+4

değerinden daha freater ise Daha fazla uyarı etkinleştirildiyse bu muhtemelen yakalanmış olabilir. – VoidStar

cevap

14

Her şeyden önce sizeof tarafından üretilen değer, unsigned türünde olan size_t şeklindedir. NOT

yükseltilir imzalı türünün olmadığını ilişki operatörünün normlara göre, olağan aritmetik dönüşümler yapılır, karşılaştırma yaparken unsigned tipi, signed tip daha yüksek rütbe arasında olduğu gibi imzasız tür. unsigned olarak değerlendirildiğinde -1 Senin durumunda

, böylece mümkün olan en yüksek unsigned değeri,

if (sizeof(int) > -1) 

yanlış olarak değerlendirilir şaşılacak temsil eder.

Ahlak hikayesi

: Bir signed arasında girişimi karşılaştırma ve unsigned sadece örneğinde olduğu gibi, garip bir sonuç üretmek üzere beklenen olduğunu. Derleyici uyarısını etkinleştirmeli ve derleyici tarafından bildirilen sorunları çözmeye çalışmalısınız.


NOT: sizeof operatörün sonucunun unsigned tamsayı türüdür

C11 itibaren

bölüm §7.19, <stddef.h>,

size_t
.

2

sizeof, boyutu döndüren ve döndürülen değer türü unsigned int olan bir operatördür. unsigned, singed türünden daha yüksek bir rakama sahip olduğundan -1, imzalanmamış numara olarak kabul edilir. Bu durumda -1 0xFFFF olarak kabul edilir. Dolayısıyla if (sizeof(int) > 0XFFFF), false'a göre değerlendirilmiştir.

enter image description here

1

Eğer

if ((int)sizeof(int) > -1) 

yazarsanız size True beklenen sonuç elde edecektir.

Operatör sizeof, bazı uygulama tanımlı imzasız tamsayı türüne karşılık gelen size_t türünde bir değer döndürür.C standardında

(6.5.3.4 sizeof ve alignof operatörler)

5 her iki operatörlerin sonuç değeri uygulama tanımlı olduğu, ve türü (işaretsiz bir tam sayı tipi) (diğer başlıklarda) tanımlanmış size_t.

daha büyük ya da tip int mertebesine en azından eşit, her durumda size_t sıralaması. Bu, derleyicinin bir ifadenin türünü belirlemesi gerektiğinde, işlenen dönüştürücünün daha yüksek sırayla işlenenin türüne göre alt sırayı düşüreceği anlamına gelir. İşlenenler aynı sıralamaya sahipse, ancak bir işlenende imzasız tamsayı türü varsa ve başka bir tamsayı türü varsa, ortak türü işaretsiz int türündedir. bir durumda Böylece

ifadesi

if (sizeof(int) > -1) 

-1

tamsayı türü size_t dönüştürülür ve bağlı tüm bitleri 1'e ayarlanır ve iç temsile olan sizeof(int)

+0

Aslında, standardın imzalı olarak imzalanmamış olarak dönüşümleri belirttiği için, negatif bir sayının iç temsili gerçekten önemli değil ... '-1', aynı imzasız değere bakılmaksızın dönüştürür (işaretsiz tür için en yüksek değer) . – Dmitri