C C 內建型別轉換注意點

2021-07-03 12:20:15 字數 1365 閱讀 1017

//當無符號整數強制轉,則高位位元組被丟棄

unsigned short a =0xabcd; //0x0022fa80 cd ab cc cc

unsigned char b =(unsigned char)a;//0x0022fa77 cd cc cc cc b =0xcd 高位位元組0xab 被丟棄

//當窄型別向寬型別賦值時,寬型別有存夠的位元組來容納,則不會有任何問題。

unsigned char c =0xcd;

unsigned short d =c;

short d1 =c;

//當型別無符號整型轉換成有符號整型時。當整數小於0x8000時,可以轉換。當大於等於0x8000時,強制轉換則變成負數。

unsigned short us1=0x8000;//us1 = 32768

short s1=(short)us1 ;//s1 = -32768

unsigned short us2=0x8001;//us2 = 32769

short s2=(short)us2; //s2 = -32767

//當有符號型別賦值給無符號型別時,當在正數範圍,則可以轉換。當為負數,則變為乙個很大的數。

short n1 =-1; //0x0038fe04 ff ff cc cc n1 = -1

unsigned short us3 =n1; //0x0038fdf8 ff ff cc cc us3 = 65535

//整數與浮點數之間關係

//浮點數使用 ieee(電氣和電子工程師協會)格式。 浮點型別的單精度值具有 4 個位元組,包括乙個符號位、乙個 8 位 excess-127 二進位制指數和乙個 23 位尾數。

// 尾數表示乙個介於 1.0 和 2.0 之間的數。 由於尾數的高順序位始終為 1,因此它不是以數字形式儲存的。

// 此表示形式為 float 型別提供了乙個大約在 3.4e–38 和 3.4e+38 之間的範圍。

unsigned int i =0x1000001;

float f1=(float)i;

unsigned int i1 =0x40001;

float f2=(float)i1;

//float只能存在unsigned int 和int 的部分。相反也是,超過23bit就會導致錯誤。

unsigned int i2= 0x800001;

float f3=(float)i2;

//總結 這些強制轉換都是在無符號整數(原碼),有符號整數(補碼),以及float 浮點數在位模式上的轉換。記憶體內容不變,只是解碼二進位制方式不同造成的。

型別轉換注意點

低 高 byte,short,char int long float doubleint i 128 byte j byte i int k 10 int l 20 system.out.println i 128 system.out.println j 128 記憶體溢位 精度丟失問題 syst...

C C 型別轉換

include include using namespace std int main 程式的執行結果如下 註解 int a 相當於將浮點數a的位址的前sizeof int 個位元組當成int型的資料輸出。float a 1.0f在記憶體中的表示是0x3f800000,當 int a強制轉換時,會...

C C 型別轉換

如果乙個int型的變數值為5,則若使用強制型別轉換或者使用memcpy,則相當於直接copy記憶體中的值,若列印,則會列印5對應的ascii值 而若使用函式轉換,則函式會操作記憶體轉為ascii值的5,若列印,則直接為5。memcpy在一定程度上相當於強制型別轉換,但是可以制定拷貝的位元組大小,因此...