表示式隱式型別和整型提公升

2021-10-12 03:46:05 字數 1787 閱讀 3903

算術轉換

c的整型算術運算總是至少以預設整型型別的精度來進行的。

為了獲得這個精度,表示式中的字元和短整型運算元在使用之前被轉換為普通整型,這種轉換稱為整型提公升。

表示式的整型運算要在cpu的相應運算器件內執行,cpu內整型運算器(alu)的運算元的位元組長度

一般就是int的位元組長度,同時也是cpu的通用暫存器的長度。

因此,即使兩個char型別的相加,在cpu執行時實際上也要先轉換為cpu內整型運算元的標準長度。

通用cpu(general-purpose cpu)是難以直接實現兩個8位元位元組直接相加運算(雖然機器指令

中可能有這種位元組相加指令)。所以,表示式中各種長度可能小於int長度的整型值,都必須先轉換為int或unsigned int,然後才能送入cpu去執行運算。

//例項

char a,b,c;..

.a = b + c;

b和c的值被提公升為普通整型,然後再執行加法運算。

加法運算完成之後,結果將被截斷,然後再儲存於a中。

整形提公升是按照變數的資料型別的符號位來提公升的

整形提公升的例子:

//負數的整形提公升

char c1 =-1

;變數c1的二進位制位(補碼)中只有8個位元位:

1111111

因為 char 為有符號的 char

所以整形提公升的時候,高位補充符號位,即為1

提公升之後的結果是:

11111111111111111111111111111111

//正數的整形提公升

char c2 =1;

變數c2的二進位制位(補碼)中只有8個位元位:

00000001

因為 char 為有符號的 char

所以整形提公升的時候,高位補充符號位,即為0

提公升之後的結果是:

00000000000000000000000000000001

//無符號整形提公升,高位補0

//例項1

intmain()

例項1中的a,b要進行整形提公升,但是c不需要整形提公升 a,b整形提公升之後,變成了負數,所以表示式

a= =0xb6 , b ==0xb600 的結果是假,但是c不發生整形提公升,

則表示式c ==0xb6000000的結果是真.

所程式輸出的結果是: c

//例項2

intmain()

如果某個操作符的各個運算元屬於不同的型別,那麼除非其中乙個運算元的轉換為另乙個運算元的型別,否則操作就無法進行。下面的層次體系稱為尋常算術轉換。

long

double

double

float

unsigned

long

intlong

intunsigned

intint

如果某個運算元的型別在上面這個列表中排名較低,那麼首先要轉換為另外乙個運算元的型別後執行運算。

警告: 但是算術轉換要合理,要不然會有一些潛在的問題。

float f =

3.14

;int num = f;

//隱式轉換,會有精度丟失

在使用型別運算的時候,一定要注意隱式型別轉換和整形提公升

Jsp隱式物件和EL表示式隱式物件

jsp隱士物件 9個 el 表示式語言 隱式物件 11 這11個隱式物件可以分為5大類 jsp隱式物件。作用域訪問隱式物件。引數訪問隱式物件。首部訪問隱式物件。初始化引數訪問隱式物件。el 表示式語言 隱式物件的特點 1.el只能獲取物件的屬性 而不能改寫 也不能直接呼叫方法 2.el中的字串即可以...

表示式型別自動提公升

變數在表示式中進行運算時,也可能發生自動型別轉換,這就是表示式型別自動提公升。在運算期間,變數會自動提公升,而不是轉換之後的結果進行提公升再向左賦值。因為在自動轉換過程中byte會轉換成int,當int強制轉換成byte時會不會損失精度,所以才會取b1的值為127,因為byte的取值範圍為 128 ...

EL表示式隱式物件

el表示式隱式物件 不需要建立,直接使用 物件名稱 說明pagescope 返回頁面範圍的變數名,這些名稱已對映至相應的值 requestscope 返回請求範圍的變數名,這些名稱已對映至相應的值 sessionscope 返回會話範圍的變數名,這些名稱已對映至相應的值 返回應用範圍內的變數,並將變...