2010-10-21 16 views
10

Herhangi bir standart çıktı ne olmalıdır? ÖrneğinŞamandıra + INF, -INF ve NAN'ın C içinde tamsayıya çevrilmesinin sonucu nedir?

bu kodu: gcc sürümü 4.2.1 üzerinde Derleyen

#include <stdio.h> 
#include <math.h> 

int main(int argc, char** argv) { 
    float a = INFINITY; 
    float b = -INFINITY; 
    float c = NAN; 

    printf("float %f %f %f\n", a, b, c); 
    printf("int %d %d %d\n", (int) a, (int) b, (int) c); 
    printf("uint %u %u %u\n", (unsigned int) a, (unsigned int) b, (unsigned int) c); 
    printf("lint %ld %ld %ld\n", (long int) a, (long int) b, (long int) b); 
    printf("luint %lu %lu %lu\n", (unsigned long int) a, (unsigned long int) b, (unsigned long int) c); 

    return 0; 
} 

(Apple Inc. 5664 build) Hedef: i686-elma-darwin10

Çıkışlar:

$ gcc test.c && ./a.out 
float inf -inf nan 
int -2147483648 -2147483648 -2147483648 
uint 0 0 0 
lint -9223372036854775808 -9223372036854775808 -9223372036854775808 
luint 0 9223372036854775808 9223372036854775808 

Hangisi oldukça garip. (int) + inf < 0!?! Paul söylediği gibi

+4

Tanımsız Davranışı - başka ne olabilir? –

+5

WIWO: garip, tuhaf. –

+1

Java'da sonsuzluklar en yakın değere (MAX_VALUE veya MIN_VALUE) dönüştürülür ve NaN 0'a dökülür. – starblue

cevap

14

, bu tanımsız oluyor:

§6.3.1.4 Gönderen:

6.3.1.4 Gerçek fl oating ve tamsayı gerçek fl oating türünde bir sonlu değer için

dönüştürüldüğünde _Bool'den başka bir tamsayı türü diğer , kesirli kısım atılır (yani değer sıfıra doğru kesilir). parçası değeri tamsayı türü ile temsil edilemiyorsa, davranış unde fi ned.50)

Sonsuz sonlu değildir ve entegre bir parçası tamamlayıcı türü temsil edilemez , bu yüzden tanımlanmamış.

İlgili konular