為什么它的結果會是0??


#include <stdio.h>

void main()

{

   int x=5,y=1;

   printf("\n%d",x>y?1:1.5);

}

15 个解决方案

#1


我只知道把那個1.5換成一個整型的數就可以了,但不知道為什么

#2


應該是printf中可變參數中表達式不是按常規方式運行。
除了把1.5改為一個整形,以下兩種方式也可以。

/* <1> */
#include <stdio.h>

void main()
{
int x=5,y=1;
printf("%f\n", x>y ? 1 : 1.5);
}

/* <2> */
#include <stdio.h>

void main()
{
   int x=5, y=1;
   int t = (x>y) ? 1 : 1.5;
   printf("%d\n", t);
}

#3


printf("%d\n",int(x>y?1:1.5));

#4


用了"%d就表示輸出一個整形,但是1.5是浮點數

#5


整形1在c++32位機中表示為00000000 00000000 00000000 00000001
浮點形1在c++32位機中表示為00011111 10000000 00000000 00000000

%d格式輸出時計算機只認最后8位即00000000所以輸出為0

#6


浮點形1在c++32位機中表示為00011111 10000000 00000000 00000000

這個是為什么????

#7


這個問題不錯。我剛才研究了一下,發現有點意思:)

printf ("%d", x > y ? 1 : 1.5);

最后一個表達式的類型是double,一般32位系統上,double的大小是8個字節。而%d是用來處理int型的,int型是4個字節,完全有可能這個double的低32位是0,所以輸出為0不足為奇。驗證一下:

int main()
{
  double d = 1;
  char *c = (char *)&d;
  int i;
  for (i = 0; i < sizeof(d); ++ i)
    printf ("%d - %d\n", i, (int)*c ++);
  return 0;
}
我們得到的輸出是:
0 - 0
1 - 0
2 - 0
3 - 0
4 - 0
5 - 0
6 - -16
7 - 63
果然,低32位(4個字節)都是0。所以這個結論不難解釋。


那么我們再試試看,如果類型是float呢?我們知道float的大小也是4個字節,和int一樣大。那么按照常理推之,printf("%d", float)如果float不是0,應該能輸出一個不是0的值。

int main()
{
  printf ("%d", (float)1);
  return 0;
}

編譯,輸出,結果還是0,而我們知道1的浮點表示並不是全部為0的,此時我也覺得有些奇怪了。

這時候只能求助於匯編代碼了:

void foo(float f)
{
  printf ("%d", f);
}

void bar(double d)
{
  printf ("%d", d);
}

反匯編得到:
subl $24, %esp
flds 8(%ebp)
fstpl 4(%esp)
movl $LC0, (%esp)
call _printf

subl $24, %esp
fldl 8(%ebp)
fstpl 4(%esp)
movl $LC0, (%esp)
call _printf

關鍵在於fldl/flds和fstpl兩條指令。
函數foo里面參數是float,所以首先使用flds,從堆棧上把這個float加載到處理器的浮點寄存器堆棧中,這個堆棧是80位精度的。然后再用fstpl,從浮點寄存器堆棧中,把這個80位精度的值,彈出來,作為一個double(64位)壓入堆棧。也就是說,就算我們傳入的參數是一個float,當它被壓入堆棧的時候,它已經變成了一個double類型。

在bar()里面,我們看到,除了在加載的時候使用了fldl(用以加載double,flds用以加載float),其他部分都是一樣的。

所以我們看到對於printf(const char *, ...)這樣的函數,后面帶...的,如果你用的參數是float,實際上是當成double傳進去的,也就是說,8個字節。




樓上的說%d只認最后8位,是不對的:-)

#8


看得不是很明白,能不能給具體地講一個你的測試程序??

#9


這個問題我終於搞明白了。

#10


歡迎大家加群(C/C++)20641933歡迎大家共同學習交流

#11


學習

#12


用了"%d就表示輸出一個整形,但是1.5是浮點數

#13


ddddh(葉君臨),強!
學習

#14


“浮點形1在c++32位機中表示為00011111 10000000 00000000 00000000”
這個是錯的,應該是:00111111 10000000 00000000 00000000

#15


mark

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com