2013-06-12 12 views
6

bana neden ve nasıl bu sorunu gidermek için 1610612736C cinsinden tam sayılarla nasıl yüzeriz? Bu kodu çalıştırdığınızda

void main(){ 
float a=3.3f; 
int b=2; 
printf("%d",a*b); 
} 

döndürür?

düzenleme: şamandıra b ile aynı saçma bir sonuç

+0

Bu bir tamsayı ve yüzer meselesi - cevabımı görün. –

+0

@Carl haklı. Çoğaltma ile bir float/int problem olmayabilir ama _definitely_ biçim dizgesindedir. – paxdiablo

+0

'printf' işlevi' int printf (const char * biçimi, ...) 'imzalı bir * varargs * yöntemidir. Bu, ilkinden sonra keyfi argümanlar alması ve bunları derleme zamanında kontrol edememesi veya * biçim dizgisinden * istenen bir türe dönüştürülmesi anlamına gelir. Biçim dizginiz 'int' için görünen'% d' diyor. 'A * b' ifadesi' double''a dönüştürülen 'float' ifadesidir. Bu tipler aynı bellek boyutuna sahip değildir, bu nedenle geçici 'çift' fiziksel olarak yarıya iner ve bir "int" olarak değerlendirilir. Bu bir Solomonî çözüm değildir. –

cevap

11

bir float ve çoğalması sonucu iade 2.0f = i int b = 2 yerine eğer, tamsayı ve kayan bile meselesi değil int, float'dur. Bunun yanı sıra, printf'a geçerken double'a yükseltilecektir. Bir %a, %e, %f veya %g biçimine ihtiyacınız vardır. %d biçimi, int türlerini yazdırmak için kullanılır.

Editörden Not: main dönüş değeri int olmalıdır. İşte sabit program:

#include <stdio.h> 

int main(void) 
{ 
    float a = 3.3f; 
    int b = 2; 
    printf("%a\n", a * b); 
    printf("%e\n", a * b); 
    printf("%f\n", a * b); 
    printf("%g\n", a * b); 
    return 0; 
} 

ve çıkışı:

$ ./example 
0x1.a66666p+2 
6.600000e+00 
6.600000 
6.6 
+2

Wow, "% a", " printf rolünde işe yaramaz format belirteci "ödül :-) – paxdiablo

+8

Harika!" IEEE754 kullanmayan sistemlerde bile (ikili) kayan nokta sayılarını% 100 doğru bir şekilde dizelerle aktarabilirsiniz. Tamamen kesin bir şekilde tüm hassas bitlerini korur. Kullanıcılar muhtemelen onu görmeyi umursamıyorlar, ancak .... –

+0

harika çalışıyor! – Wicelo

2

Alternatif olarak, aynı zamanda

printf("%d\n", (int)(a*b)); 

yapabileceğini ve bu (tür) bekliyorsanız sonucu basacaktır .

Her zaman değişkenleri biçim dizgisiyle eşleşecek şekilde genel olarak yazmalısınız, aksi halde yazdırılan bazı tuhaf değerleri görebilirsiniz.

İlgili konular