型別轉換主要可以籠統的分為兩大類:隱式型別轉換與顯式型別轉換。
注意:不論是隱式型別轉換還是顯式型別轉換,在進行算術型別轉換時,高精度轉為低精度都會有精度損失,低精度轉為高精度是沒有。比如在有符號的char型別在與int型別進行轉換時。將有符號char型別轉換成int型別時,值是無損失的(不會發生變化的)。而int型別賦值給有符號char型別時其實進行的是截斷式賦值。 例子:隱式型別轉換不需要程式設計師介入,是自動進行的。通常我們注意的比較多的換轉換通常是算數型別的隱式型別轉換。signed char sc1 = -128;
//結果i1值為-128,將10000000自動擴充套件為111...10000000
int i1 = sc1;
int i2 = -1073741823;
//結果sc2值為1,發生了截斷式賦值,將11000...00000001截斷為00000001
signed char sc2 = i2;
在表示式求值時,算數轉換的規則定義了一套型別轉換的層次,其中的大方向是將運算物件轉換成最寬的型別。具體規則如下:
首先會進行整形提公升,如果運算物件雙方是bool、char、signed char、unsigned char、short、與unsigned short
等可以不損失精度的放入int型別中,它們就會提公升為int型別。如果它們中有不能用int型別無損儲存的,比如unsigned int、long
等型別,則會將較小的一方提公升為精度較高一方的型別。
如果運算物件雙方乙個為無符號型別,乙個為有符號型別,並且無符號型別不小於有符號型別,則將帶符號的運算物件轉換成無符號的。
如果帶符號型別大於無符號型別,則結果需要依賴機器。如果此帶符號型別可以無損儲存此無符號型別,則將無符號型別轉換成帶符號型別。否則,結果反之。比如兩個運算物件分別是long
與unsigned int
型別,則怎麼轉換就需要依賴機器中long
型別占用空間是否比int
多。
總結:表示式求值在根據陣列名轉成指標:例如double>float>int
之類的隱式型別轉換後求出來的值在賦值時還會再進行一次隱式型別轉換。例如:int c=5; char d='0'; char a = c + d;
int a[10]; int *p=a;
中將陣列名轉成指標,但是當陣列被用作decltype
關鍵字的引數或者作為取位址符(&)、sizeof
以及typeid
等運算子的運算物件時,上述轉換不會發生;
指標的轉換:比如,第一、常量正數值0或者字面值常量nullptr能轉換成任意指標型別;第
二、指向任意非常量的指標能轉換成void *
;第
三、指向任意物件的指標能轉換成const void*
;
轉成bool
型別(通常在判斷表示式中);
轉換成常量:允許將非常量型別賦值給常量;
顯式型別轉換也叫作強制型別轉換,除非必須,否則不建議使用。並且在這方面,c語言提供的強制型別轉換是及其不完善的,c++對與強制型別轉換比之要完善很多,不過依然不建議使用。
同位寬的無符號與有符號的整數型別進行轉換時,記憶體中機器碼形式不變,變得是機器碼的解讀方式,以補碼形式進行解讀還是無符號數形式進行解讀。
在進行擴充套件位寬的整數型別轉換時,無符號數進行零擴充套件,有符號數進行符號擴充套件。(這兩種方式都能保證擴充套件後原值不變,原理可參考補碼原理)
在進行截斷位寬的整數型別轉換時,採用截斷式轉換。
同時進行無符號與有符號和不同位寬型別轉換時,首先進行位寬變換。
#include //#include typedef unsigned char *byte_pointer;
void show_bytes(byte_pointer start, int len)
void test()
int main()
執行結果如下:
xhy@ubuntu:~/c_learn/datatype_int_convert$ ./test
16位有符號數-12345與其機器碼: -12345: c7 cf
將16位有符號數-12345轉換成16位無符號數後其值與機器碼: 53191: c7 cf
將16位有符號數-12345擴充套件成32位有符號數後其值與機器碼: -12345: c7 cf ff ff
將16位無符號數53191擴充套件成32位無符號數後其值與機器碼: 53191: c7 cf 00 00
將16位有符號數-12345轉成32位無符號數後其值與機器碼: 4294954951: c7 cf ff ff
C語言中的型別轉換
計算機進行算術運算時,通常要求運算元具有相同的位數 相同的儲存方式。而c語言支援在表示式中混合使用基本資料型別,因此需要在不同的資料型別之間進行轉換。在c語言中存在兩種型別的轉換,一種是隱式轉換,由編譯器自動處理轉換而無需程式開發人員介入,另一種是強制型別轉換 顯式轉換 需要程式開發人員使用強制轉換...
C語言中的型別轉換!
自動轉換發生在不同資料型別運算時,在編譯的時候自動完成 自動轉換遵循的規則就好比小盒子可以放進大盒子裡面一樣,下圖表示了型別自動轉換的規則。縮寫 ascii 英文全稱 american standard code for information interchange 美國資訊交換標準 是一種用於資...
C語言中的型別轉換
c語言中的型別轉換可以分為兩種 隱式轉換中的規則有 窄的向寬的轉變 unsigned 同型別無符號比有符號寬 同型別的轉換例如 int a 10 unsigned int b 10 if a b printf a b else printf a不同型別的轉換例如 int c 10 unsigned ...