回覆列表
-
1 # 七月流光1
-
2 # 深苟
當然有實際作用。由於對常數做“強制型別轉換”,本質上和對變數做轉換一樣,下面就從“強制型別轉換”的原理做簡要分析。理解型別轉換,首先要從機器碼,即計算機如何儲存不同型別的資料著手。我們都知道在計算機中資訊都以二進位制用0和1來表示資訊。為了運算方便,大多采用補碼形式儲存資料。比如一個C語言的short型別,一般short型別為2個位元組,也就是用16位二進位制數表示。劃重點:資料型別就是把計算機儲存的機器碼(二進位制資料)給出不同規則的解釋。比如二進位制為 1111 1111,char型就解釋為-1,unsigned char就解釋為255。
1.首先看一下相同長度的強制型別轉換。程式碼:
short x = -4321;
unsigned short y = (unsigned short)x;
可以發現,機器碼一樣,但x,y作為不同型別,解釋的值不一樣。
2.其次看下由長變短的強制型別轉換。
int x = -4321;
short y = (short)x;
這是由32位的int型,強制轉換為16位的short型,結果如下
可以看出:高位直接階段,低位直接賦值。
3.再次看下由短變長的強制型別轉換。
short x = 4321;
int y = (int)x;
這是由16位的short型,強制轉換為32位的int型,結果如下
可以看出:低位直接賦值,高位擴充套件為短字長的符號位(0為正,1為負)
總結:對於常數也是一樣,強制型別轉換的作用是把原有型別的機器數值解釋為目標型別,所以是有重要意義的。
有意義。在一些校驗演算法中,會捨去高位,只保留一個位元組。這是就需要強制轉換捨去高位,計算後將結果儲存到byte型別變數中。如果不強制轉換把超過八位元組的常量儲存到byte型別變數中會報錯。我記得pe檔案中就有一個校驗有類似演算法,將結果儲存到pe中。如果pe檔案被修改,例如中毒了,就會導致實際計算出來的值和pe檔案中的保留值不一樣,以此可判定檔案是否被修改。