1. 程式人生 > >為什麼不能夠用unsigned 修飾 float和double

為什麼不能夠用unsigned 修飾 float和double

最近犯了一個錯誤:

定義變數型別的時候竟然定義了unsigned double的型別。由於編譯能夠通過,因此一直沒有發現這樣寫會有什麼樣的問題。

今天一次偶然的測試中發現這些變數的值都是整數。一開始覺得奇怪,明明是浮點數,怎麼變成整型了?

 

後來上網查了一下資料:

原來浮點數是不能用 unsigned來規範的。unsigned 的意思就是把記憶體中的資料第一位也用來表示資料,而不用於表示符號位。而浮點數規定記憶體中資料的第一位必須是符號位。因此兩者之間是互相矛盾的,這也就是為什麼浮點數不會有unsigned型別。

可是這樣的寫法也不至於在VC編譯時報錯,只會給出一個wraning。

在某些編譯器下unsigned float 和 unsigned double會被自動轉換成unsigned int 型別,而不報錯。這時sizeof(unsigned float)和sizeof(unsigned double)的值是4。

 

切記:不能定義unsigned float和unsigned double型別。
 

因為整型是一串二進位制來存內容
比如00000000,其中第一位是符號位用來表示正負,但是你設定無符號就可以讓後面的往這裡進位,打到增加資料的目地。

可是浮點數是按照 整數部分,小數部分,指數部分存放的。運算也是分開來運算的。
沒法做這樣的進位。

 

unsigned只能修飾整型,即char short int long

資料型別定義的時候float,double就是帶符號的了,浮點數第一位就是符號位