int,float,double型轉換深析

2021-07-25 22:01:37 字數 1906 閱讀 9640

int整型: .net中特指int32為32位長度符號整型變數

float:單精度浮點數32位長度1位符號位8位指數字與23位資料位 .net中又稱為single

double:64位長度雙精度浮點數1位符號位11位指數字52位資料位

它們互相關係就:int可以穩式轉換成float和double,float只能強制轉換成int但可以隱式轉換成double,double只能強制轉換成float和int

廢話說完這就出現了幾個困難而且比較意思困難

1 int i = int32.maxvalue;

2 float f = i;

3 int j = (int)f;

4 bool b = i == j;

這裡b=false。剛才這個操作,如果我們把float換成long,第一次進行隱式轉換,第二次進行強制轉換結果將會true。乍一看float.maxvalue比int.maxvalue大了不知道多少倍,然而這個隱式轉換中卻造成了資料丟失。int.maxvalue這個值等於2^31-1,寫成二進位制補碼形式就01111…(31個1)。這個數表示成float計數科學計數法時候將會寫成+0.1111…(23個1)*2^31。對於那31個1裡面最後8個被float無情拋棄了。因此再將這個float強制轉換回int時候,對應int二進位制補碼表示已經變成了0111…(23個1)00000000。這個數與最初那個int相差了255,所以造成了不相等。

那麼提出另乙個困難,嘛樣int變成float再變回來和從前值相等呢?這個困難其實完全出那23位float資料位上了。對於乙個int把它寫成二進位制形式之後成為了個一32個長度0、1排列對於這個排列只要第乙個1與最後乙個1之前間距不超過23,那麼它轉換成float再轉換回來兩個值就會相等。這個困難與大小無關而且這個集合int這個全集下並不連續。

1 double d = 0.6;

2 float f = (float)d;

3 double d2 = f;

4 bool b = d == d2;

這裡b也false。剛才這個操作如果開始另d等於0.5結果就將會true。乍一看0.6這個數這麼短,double和float都肯定能夠表示那麼轉換過去,再轉換回來結果理應相等。其實這因為我們用十進位制思考困難太久了。如果我們0.6化成二進位制小數,可以發現得到結果0.10011001……(1001迴圈)這乙個無限迴圈小數。因此不管float還double它儲存0.6時候都無法完全儲存它精確值(計算機不懂分數呵呵)。這樣話由於float儲存23位,而double儲存52位,就造成了double轉化成float時候丟失掉了一定資料,再轉換回去時候那些丟掉值被補成了0。因此這個後來double和從前double值已經不再一樣了。

這樣就又產生了乙個困難,嘛樣double轉換成float再轉換回來兩個值相等呢?其實這個困難與剛才int那個困難驚人相似(廢話都和float打交道能不相似麼)只不過我們還需要考慮double比float多了3位指數字,太大數double能表示但float不行。

還乙個算數學上困難嘛樣十進位制小數表示成二進位制不無限小數呢?這個困難可以說完全成為數學範疇內困難了,但比較簡單,答案也很明顯。對於所最後一位以5結尾十進位制限小數都可以化成二進位制限小數(雖然這個小數可能長到沒譜)。

最後乙個意思困難,剛才說過0.6表示成為二進位制小數之後0.1001並且以1001為迴圈節無限迴圈小數,那麼我們將它存成浮點數時候一定會某個位置將它截斷(比如float23位和double52位)。那麼真正存記憶體裡這個二進位制數轉化回十進位制到底比原先十進位制數大呢還小呢?答案it depends。人計算十進位制時候四捨五入,計算機再計算二進位制小數也挺簡單就0舍1入。對於float要截斷成為23位,假如卡24位上1那麼就會造成進製,這樣話存起來值就比真正十進位制值大了。如果0就捨去,那麼存起來值就比真正十進位制值小了。因此這可以合理解釋乙個困難,就0.6d轉換成float再轉換回double,它值0.60000002384185791這個值比0.6大,解釋就0.6二進位制科學計數法表示第24位1造成了進製

int float double 的那點小秘密

偶編c的時候,有的時候就是因為這些float int double之間的混算錯得一塌糊塗。這位仁兄說得挺好的,不過要想在深入了解下去,可就麻煩了。如果沒那知識,就一定要注意強制型別轉換後賦值和運算,比較保險!原文如下 抱歉我用了乙個這麼 二 的題目,不過二點就二點吧,希望內容還不算太二。其實學習過程...

int float double 最大值,最小值

中沒有double的最大最小值。如果輸出的比如 100lf輸出2.23432432,沒有達到100位,則最後2後面不一定都是0。原文見view plaincopy to clipboardprint?coder acboy date 2010 3 1 include include using na...

泛型 泛型類 泛型方法 泛型擦除

1 是什麼?一種允許我們在不確定引數型別時候使用的型別。例如我不知道a方法應該會傳string還是int,我就用個泛型先佔坑。2 為什麼要用泛型?泛型可以在編譯期自動確定具體型別,檢查型別是否匹配,可以提高 的重用率,減少冗餘編碼。3 泛型與object的區別?像上面說的我不知道方法a的引數型別,其...