簡體   English   中英

浮動為int意外行為

[英]float to int unexpected behaviour

您能解釋一下該程序的輸出行為嗎?

int main()
{
  float a = 12.5;
  printf("%d\n", a);
  printf("%d\n", *(int *)&a);
  return 0;
} 

可以在http://codepad.org/AQRlAzkC中檢查代碼嗎?
為什么輸出此輸出..

您不想將浮點指針轉換為整數指針。 浮點數和整數的存儲方式不同,如果這樣做,將不會進行任何轉換,因此您會將垃圾打印到屏幕上。 但是,如果將int值轉換為float值,則編譯會為您將float從其內部類型轉換為整數。 因此,您應將(int *)替換為(int)

另外, %d用於十進制(整數)值。 您想要的是%f ,它是第一個printf浮點值。

您想要的是:

#include <stdio.h>

int main()
{
  float a = 12.5;
  printf("%f\n", a); //changed %d -> %f
  printf("%d\n", (int)a); //changed *(int *)& -> (int) for proper conversion
  return 0;
} 

在這里驗證: http : //codepad.org/QD4kzAC9

浮點數以IEEE 754格式存儲。 當您將%d格式說明符傳遞給printf() ,是在告訴它查看從&a開始的第一個sizeof(int)字節。 在IEEE 754格式中,這是一堆零。

我強烈建議您閱讀每位計算機科學家應該了解的有關浮點運算的知識

區別在於,在一種情況下,編譯器執行隱式強制轉換(我假設您從第一個隱式強制轉換中獲得12),而在第二種情況下,編譯器正在獲取包含浮點值的內存並將其解釋為int。 如果您包括實際的輸出是有幫助的。

強制轉換指針和強制轉換值是非常不同的操作。 當將float轉換為int時,您要求將float值轉換為int值,這將導致實際的數據轉換。 當將float指針轉換為int指針時,您只是覆蓋類型檢查。 指針只是整數存儲位置:將其強制轉換為另一種指針不涉及任何轉換。

因此,您所看到的就是將浮點數視為整數時的位模式。

IEEE-754標准描述了大多數計算機用來表示浮點數的位模式。 另一方面,整數只是以二進制為基礎表示的整數。 因此,取一個實數位並將其解釋為整數會產生非常不同的結果。

讓我們來看看。

  1. 浮點數以IEEE 754中定義的格式存儲。請參見此處: http : //en.wikipedia.org/wiki/IEEE_754-2008
  2. 旁注:您將在第一條指令中將double傳遞給float。 這將在編譯時強制轉換,但某些編譯器可能會抱怨。 如果要使用浮點數,請附加f: float a = 12.5f;
  3. 您要將浮點數傳遞給%d參數。 這是不好的。 編譯器在這里的行為可能有所不同,有些可能會警告您。 如果要傳遞浮點數,請使用%f。
  4. 您正在獲取IEEE-754格式的整數並將其打印出來。 請參閱項目1中的鏈接以查看要打印的內容。

我認為它打印12 12是因為%d沒有區別,並且*&a = a

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM