c語言型別轉換分為兩種:
也許你曾經遇到過乙個負數經過型別轉換後可能變成乙個很大的整數之類的現象,卻不知道實質上是因為什麼,只是淺顯地了解到型別轉換會向著更大精度的方向轉化。尤其是對於計算機基礎知識不紮實或者很多半路出家(比如我)的人來說不是很了解背後的原因。希望下面的解釋能夠解決這個疑惑。本文以c語言為例,其他類似語言也有類似的結論,深究到底自會明白。
下面從詳細介紹乙個顯式型別轉換開始。要想深入理解型別轉換,首先要有機器數(原碼、補碼和反碼)的相關基本了解。我們都知道在計算機中資訊都以二進位製用0和1來表示資訊。為了運算方便,大多採用補碼形式儲存資料。比如乙個c語言的short型別,一般short型別為2個位元組,也就是用16位二進位制數表示。那麼在計算機中的-1(也就是所謂的真值)表示為,也就是16位的-1補碼為:
[−簡單測試一下計算機中是否以補碼表示運算資料:1]補=
1111
1111
1111
1111
將10進製轉換成為二進位制函式:
/* 模板函式,可將基本資料型別的10進製表示(說法欠妥,您能理解就行)轉換成計算機中的二進位制表示 */
template
char* decimaltobinary(t n, char *b)
測試**:
void main()
執行結果:
如我們預期, 真值 -1 在計算機中的16位機器數表示為1111 1111 1111 1111。
理解的前提有了,下面進入正題:計算機如何處理型別轉換。
先來看一下同等長度變數是如何處理的。
同樣長度的不同型別相互轉換時,比方 sh
ort 強制轉換成 un
sign
edsh
ort 。實際在轉換過程中,轉換後的 un
sign
edsh
ort 與原來的 sh
ort 在計算機中的二進位制表示形式一樣的,改變的只不過是解釋他們的方式。
強制型別轉換結果保持位值不變,只是改變了解釋這些位的方式。**測試:
void main()
執行結果:
結果分析:
顯然,結果如預期。可以試一下,按照無符號數的解釋,1110111100011111這麼一串補碼的確表示61215。
上面介紹了理解型別轉換的前提。並詳細介紹了同等長度(比方 in
t 型別與 un
sign
edin
t 型別一般都是2個位元組的表示長度)的不同型別轉換,並且總結一句話就是:
強制型別轉換結果保持位值不變,只是改變了解釋這些位的方式。下面來看一下不同字長變數之間的轉換:
短字長變數向長字長變數的轉換
相信大家已經對於型別轉換有了較為深刻的認識。終究要理解本質的話,還是要深入到0/1的世界,站在計算機的角度理解我們看到的表面現象。
就像學的很多數學,微積分、線性代數、概率論,一開始並不知道學這麼些有什麼用,賣菜的大爺大媽不會調皮到要出個題目才把菜賣給你,玩骰子的時候也不會想著算計它出現某個數字的概率。不過後來在接觸機器學習與資料探勘的過程中,才能夠慢慢發現數學的用處。如果能夠在當初開始學習的時候就能夠感受到這些,那該有多好。
- 如果自己寫程式測試以上理論的話,請注意相關細節。
二進位制表示如果採用陣列儲存的話,記得在10進製數對應所需的二進位制數上加1。否則會溢位。
而這種溢位經試驗在vc6.0下面並不會被檢查出來,程式可以執行,但是最終結果將不會是預期。
- 在vs下面就能夠檢測出這種錯誤並終止程式執行,故建議使用vs. 否則可能由於一些其他外在原因(編譯器的原因)將得不到理論值。
深入理解C語言 深入理解指標
關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...
深入理解C語言 深入理解指標
關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...
C 深入理解型別
值型別 值型別通常儲存在棧中,值型別管理由作業系統管理 引用型別 引用型別儲存在堆中由gc管理 引用型別巢狀定義值型別 值型別巢狀引用型別 值型別繼承自valuetype,valuetype有繼承自system.object 引用型別直接繼承自system.object 值型別的記憶體不受gc控制,...