C 的型別轉換

2021-10-07 08:10:46 字數 2509 閱讀 7083

《c++ primer plus》筆記

c++自動執行很多態別轉換:

初始化和賦值進行的轉換:

c++允許將一種型別的值賦給另一種型別的變數。這樣做時,值將被轉換為接收變數的型別。將乙個值賦給取值範圍更大的型別通常不會導致什麼問題,只是占用的位元組更多而已。然而,將乙個很大的long值賦給float變數將降低精度。因為float只有6位有效數字。

潛在的數值轉換問題:

轉換潛在的問題

將較大的浮點型別轉換為較小的浮點型別,如將double轉換為float

精度(有效數字)降低,值可能超出目標型別的取值範圍,在這種情況下,結果將是不確定的

將浮點型別轉換為整型

小數部分丟失,原來的值可能超出目標型別的取值範圍,在這種情況下,結果將是不確定的

將較大的整型轉換為

小數部分丟失,原來的值可能超出目標型別的取值範圍,在這種情況下,結果將是不確定的

較大的整型轉換為較小的整型,如將long轉換short

原來的值可能超出目標型別取值範圍,通常只複製右邊的位元組

將0賦給bool變數時,將被轉換為false;而非零值將被轉換為true。

將浮點值賦給整型將導致兩個問題。首先,將浮點值轉換為整型會將數字截短(除掉小數部分)。其次,float值對於int變數來說可能太大了。在這種情況下,c++並沒有定義結果應該是什麼,這意味著不同的實現的反應可能不同。

當將整數變數初始化為浮點值時,有些編譯器將提出警告,指出這可能丟掉資料(喪失精度)。

以{}方式初始化時進行的轉換(c++11)

c++11將使用大括號的初始化成為列表初始化(list-initialization),因為這種初始化常用於給複雜的資料型別提供值列表,所以它對型別轉換的要求更嚴格。具體地說,列表初始化不允許縮窄(narrowing),即變數的型別可能無法表示賦給它的值。例如,不允許將浮點型轉換為整型(整型的表示範圍沒有浮點型表示的範圍大)。在不同的整型之間轉換或將整型轉換為浮點型可能被允許,條件是編譯器知道目標變數能夠正確地儲存賦給它的值。例如,可將long變數初始化為int值,因為long總是至少與int一樣長;相反方向的轉換也可能被允許,只要int變數能夠儲存賦給它的long常量;

表示式中的轉換

當同乙個表示式中包含兩種不同的算術型別時,c++將執行兩種自動轉換:首先,一些型別在出現時便會自動轉換;其次,有些型別在與其他型別同時出現在表示式中時將被轉換。

自動轉換:在計算表示式時,c++將bool、char、unsigned char、signed char和short值轉換為int。例如true被轉換為1,false被轉換為0。這些轉換被稱為整型提公升

short chickens =20;

short ducks =35;

short fowl = chickens + ducks;

在第三條語句中,c++程式先取得chickens和ducks的值,並將它們轉換為int。然後,程式將結果轉換為short型別,因為結果將被賦給乙個short變數。

如果short比int短,則unsigned short型別將被轉換為int;如果兩種型別的長度相同,則unsigned short型別將被轉換為unsigned int。此規則確保了在對unsigned short進行提公升時不會損失資料。

wchar_t將被提公升為下列型別中第乙個寬度足夠儲存wchar_t取值範圍的型別:int、unsigned int、long、unsigned long;

其它轉換:將不同型別進行算術運算時,也會進行一些轉換,例如將int和float相加時。當運算涉及兩種型別時,較小的型別將被轉換為較大的型別。例如將int和float相加時。當涉及兩種型別時,較小的型別將被轉換為較大的型別。編譯器通過校驗表來確定在算術表示式中執行的轉換。c++11的校驗表,編譯器將依次查閱該列表。

傳遞引數時的轉換

傳遞引數時的型別轉換通常由c++函式原型控制。然而,也可以取消原型對引數傳遞的控制,儘管這樣做並不明智。在這種情況下,c++將對char和short型別(signed和unsigned)應用整型提公升。另外,為保持與傳統c語言中大量**的相容性,在將引數傳遞給取消原型對引數傳遞控制的函式時,c++將float引數提公升為double引數。

強制型別轉換

c++還允許通過強制型別轉換機制顯式地進行型別轉換。強制型別轉換的格式有兩種。例如,為將儲存在變數thorn中的int值轉換為long型別,可以使用下述表示式中的一種:

(

long

) thorn;

long

(thorn)

;

強制型別轉換不會修改thorn變數本身,而是建立乙個新的、指定型別的值,可以在表示式中使用這個值。

c++還引入了4個強制型別轉換運算子,對它們的使用要求更為嚴格。

mysql型別轉換c 型別轉換 C 型別轉換

一 簡介 型別轉換 把資料從一種型別轉換另一種型別 我們要求等號兩邊參與運算子必須型別一致,如果不一致,滿足下列條件會發生自動型別轉換或者隱式型別轉換。1.兩種型別相容 例如 int和double 相容 都是數字型別 2.目標型別大於源型別 double int 顯示型別轉換 1.兩種型別相相容 i...

C 的型別轉換

2008 03 15 12 59 強制型別轉換容易引發錯誤,所以被認為是一種醜陋的語法。c 中有乙個觀念 醜陋的語法就應該用醜陋的方式表達。所以,c 的轉換操作符使用 x cast 這種一種繁瑣的形式。目的是為了讓你在使用型別轉換前三思而行,看看是不是又不需要型別轉換的方法或設計。更重要的是,c風格...

C 型別的轉換

型別的轉換c 中型別轉換 顯隱 的機制分為兩種 一 隱式轉換 implicit conversions 二 顯式轉換 explict conversions 隱式轉換不需要指明欲轉變的型別 顯式轉換明確地使用轉換運算子 cast 指定要轉換成哪一種型別。c 允許程式設計師如果對於溢位進行處理 che...