C語言的表示式求值問題(整型提公升)

2021-09-28 14:21:12 字數 1290 閱讀 3622

表示式求值的順序一部分是由操作符的優先順序和結合性決定。

同樣,有些表示式的運算元在求值的過程中可能需要轉換為其他型別。

隱式型別轉換

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

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

(為什麼要整型提公升?)整型提公升的意義:

表示式的整型運算要在cpu的相應運算器件內執行,cpu內整型運算器(alu)的運算元的位元組長度一般就是int的位元組長度,同時也是cpu的通用暫存器的長度。

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

通用cpu(general-purpose cpu)是難以直接實現兩個8位元位元組直接相加運算(雖然機器指令中可能有這種位元組相加指令)。所以,表示式中各種長度可能小於int長度的整型值,都必須先轉換為int或unsigned int,然後才能送入cpu去執行運算。*

運算元在進行運算操作時根據情況就可能要轉換成其他型別且一般都轉換成整型,因為運算操作要在cpu的暫存器裡,暫存器通常是32位的

例如char型別的a,b,c變數型別進行加減賦值操作時(a=b+c)b和c的值被提公升為普通整型,然後再執行加法運算。加法運算完成之後,結果將被截斷,然後再儲存於a中。

如何整型提公升

整型提公升時:要先看該變數自身的型別

如果是有符號數(signed),先看符號位為幾(負數為1正數為0),就在前面的高位補幾

如果是無符號數(unsigned),前面的高位補0

//負數的整形提公升

char c1 =-1

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

1111111

因為 char 為有符號的 char

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

提公升之後的結果是:

11111111111111111111111111111111

//正數的整形提公升

char c2 =1;

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

00000001

因為 char 為有符號的 char

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

提公升之後的結果是:

00000000000000000000000000000001

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

表示式求值問題

這是清華大學鄧俊輝資料結構 c 中的乙個案例,通過使用棧這種資料結構,完成了較為複雜的表示式求值問題,以下 是我整理改編而成,能夠完成加減乘除,乘方 階乘的運算,以及括號的處理。在這裡,我使用到了c stl 中的容器stack。include include include include incl...

表示式求值的問題

include include include define false 0 define true 1 define error 0 define ok 1 define overflow 1 typedef int status stack typedef char selemtype defi...

C 表示式求值

1 問題描述 輸入為四則運算表示式如 2 3 5 7 9 3,僅由 構成,沒有空格,要求其值。2 問題分析 有兩種方法,一是用遞迴,將表示式分解為項和因子,再通過遞迴逐塊解決。其中,我們需要清楚的是,表示式為項的加減,項為因子的乘除,因子為數值或帶括號的表示式。第二種方法是通過堆疊,先將表示式轉化成...