歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 為什麼在類型轉換時C++將int轉換成float

為什麼在類型轉換時C++將int轉換成float

日期:2017/3/1 9:29:31   编辑:Linux編程

既然float不能表示所有的int,那為什麼在類型轉換時C++將int轉換成float?

問題:

代碼如下:

  1. int i =23;
  2. float f =3.14;
  3. if(i == f)// 執行某段代碼

編譯器會將i轉換成float類型,然後比較這兩個float的大小,但是float能夠表示所有的int嗎?為什麼沒有將int和float轉換成double類型進行比較呢?

回答:

在整型數的演變中,當int變成unsigned時,會丟掉負數部分(有趣的是,這樣的話,0u < -1就是對的了)。

和C語言中的大部分機制(在C++中得到繼承)一樣,就硬件操作而言,常見的算術轉換應該簡明易懂。C語言的發明者精通他們所使用機器上的匯編語言,他們編寫的C語言對他們和像他們一樣編寫程序的人有直接的意義,直到使用匯編語言編寫(諸如UNIX內核)的程序時。

現如今,一般來說,處理器並不具有混合類型的指令系統(如float和double相加、比較int和float,諸如此類),因為如果這樣做造成芯片晶圓的巨大浪費——如果你想支持更多不同的類型,你不得不實現更多的操作碼。然而,在實際中,你只有實現"add int to int"、"compare float to float"和"multiply unsigned with unsigned"等功能的常見指令,這使得優先進行算術轉換變得很有必要——它們是指令系統中兩種類型的映射關系,它們中的大部分很有用處。

從習慣編寫低級別機器代碼的編程人員的角度來說,如果有了混合類型,那麼在一般情況下最有可能使用的匯編指令就是那些只需要進行最少類型轉換的指令。其中,有一種特殊情況就是浮點數的轉換,特別是在20世紀70年代早期,當時C語言正在被開發,計算機運行速度很慢,而浮點數的計算是通過軟件完成的,所以進行轉換的成本很高。這拖慢了常用算術運算的轉換開發——當時只有一種操作數實現了轉換(這個例外就是long到unsigned int的轉換,這種轉換沒有任何要求,在大部分機器上都可以進行。當然並不是全部,因為總有例外情況)。

所以,編寫常用的算術轉換是為了完成匯編程序員在大部分時間需要做的事情:即有兩種不匹配的類型,將一種轉換成另一種。這也就是匯編代碼所做的事情,除非有特別原因需要進行其它類型轉換。對於那些習慣編寫匯編代碼的人來說,除非是特殊需要,才會被迫去編寫一種不同的類型轉換。顯然,這種情況下提出編寫轉換是很自然的事情。雖然,你可以簡單地寫成這樣

  1. if((double) i <(double) f)

順便提一下,在這個問題中有趣的是,unsigned的優先級高於int,所以把intunsigned進行比較時,最終進行的是unsigned類型的比較(開頭提到的0u < -1就是這個道理)。我猜測這可能是在早些時候(計算機發展初期),當時的人們認為unsignedint在所表示的數值范圍上受到的限制更小:現在還不需要符號位,所以可以使用額外的位來表示更大的數值范圍。如果你覺得int可能會溢出,那麼就使用unsigned好了——在使用16位表示的ints時這個擔心會更明顯。

------------------------------分割線------------------------------

C++ Primer Plus 第6版 中文版 清晰有書簽PDF+源代碼 http://www.linuxidc.com/Linux/2014-05/101227.htm

讀C++ Primer 之構造函數陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm

讀C++ Primer 之智能指針 http://www.linuxidc.com/Linux/2011-08/40177.htm

讀C++ Primer 之句柄類 http://www.linuxidc.com/Linux/2011-08/40175.htm

將C語言梳理一下,分布在以下10個章節中:

  1. Linux-C成長之路(一):Linux下C編程概要 http://www.linuxidc.com/Linux/2014-05/101242.htm
  2. Linux-C成長之路(二):基本數據類型 http://www.linuxidc.com/Linux/2014-05/101242p2.htm
  3. Linux-C成長之路(三):基本IO函數操作 http://www.linuxidc.com/Linux/2014-05/101242p3.htm
  4. Linux-C成長之路(四):運算符 http://www.linuxidc.com/Linux/2014-05/101242p4.htm
  5. Linux-C成長之路(五):控制流 http://www.linuxidc.com/Linux/2014-05/101242p5.htm
  6. Linux-C成長之路(六):函數要義 http://www.linuxidc.com/Linux/2014-05/101242p6.htm
  7. Linux-C成長之路(七):數組與指針 http://www.linuxidc.com/Linux/2014-05/101242p7.htm
  8. Linux-C成長之路(八):存儲類,動態內存 http://www.linuxidc.com/Linux/2014-05/101242p8.htm
  9. Linux-C成長之路(九):復合數據類型 http://www.linuxidc.com/Linux/2014-05/101242p9.htm
  10. Linux-C成長之路(十):其他高級議題

Copyright © Linux教程網 All Rights Reserved