既然float不能表示所有的int,那為什麼在類型轉換時C++將int轉換成float?
回答:
在整型數的演變中,當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的轉換,這種轉換沒有任何要求,在大部分機器上都可以進行。當然並不是全部,因為總有例外情況)。
所以,編寫常用的算術轉換是為了完成彙編程序員在大部分時間需要做的事情:即有兩種不匹配的類型,將一種轉換成另一種。這也就是彙編代碼所做的事情,除非有特別原因需要進行其它類型轉換。對於那些習慣編寫彙編代碼的人來說,除非是特殊需要,才會被迫去編寫一種不同的類型轉換。顯然,這種情況下提出編寫轉換是很自然的事情。雖然,你可以簡單地寫成這樣
if((double) i < (double) f)
順便提一下,在這個問題中有趣的是,unsigned
的優先順序高於int
,所以把int
和unsigned
進行比較時,最終進行的是unsigned類型的比較(開頭提到的0u < -1
就是這個道理)。我猜測這可能是在早些時候(計算機發展初期),當時的人們認為unsigned
比int
在所表示的數值範圍上受到的限制更小:現在還不需要符號位,所以可以使用額外的位來表示更大的數值範圍。如果你覺得int
可能會溢出,那麼就使用unsigned好了——在使用16位表示的ints時這個擔心會更明顯。
via: stackoverflow
作者:wintermute 譯者:KayGuoWhu 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive