什麼是整型提公升?
整型提公升是c程式語言中的一項規定:在表示式計算時,各種整形首先要提公升為int型別。表示式的整型運算要在cpu的相應運算器件內執行,cpu內的整型運算器的運算元的位元組長度一般是int 型別的位元組長度,即四個位元組。
因此即使是兩個char( char型別為乙個位元組)型別的數相加,在cpu相應的運算器件中也很難直接進行相加,這時候就要進行整型提公升到四個位元組才能進行相加計算。
整型提公升的規則:
整型提公升分為有符號和無符號兩種,**有符號的:**整型提公升時是按照變數的補碼被截斷時的最高位是什麼進行補位的,如果截斷後最高位即最左面的一位數為 1 則在最高位前補 1 ,如果最高位是 0 則在前面補 0 ,補夠32位即int型別即可。無符號的:直接在被截斷的前面補 0 即可。
下面我們通過乙個**來說一下整型提公升:
#include
intmain()
如果按照正常的加減運算,是不是計算的結果為130,但實際上結果是-126.
如圖:
造成這種差異的原因就是發生了整型提公升與截斷。
上題解析:
數字3的補碼為:00000000000000000000000000000011 , 將數字3交給a時,因為a的型別為char型別即只有乙個位元組,所以a中只能儲存乙個位元組即8個位元位,所以需要進行截斷只保留最後的8個位元位,所以此時a中儲存的位元位為:00000011
數字127的補碼為:00000000000000000000000001111111 同理也因為為char型別發生截斷,截斷後b中儲存的位元位為: 01111111
在執行 a+b 時先對8位元位的a,b進行整型提公升,因為都為char 型別所以為有符號位,提公升時,補最高位的數字,a,b的最高位都為 0 ,所以在最高位前面補0即可,補夠32位。
提公升後兩者的補碼為:
00000000 00000000 00000000 00000011
00000000 00000000 00000000 01111111
將a和b的補碼進行相加後得到的補碼為:
00000000 00000000 00000000 10000010
又因為c 也為char型別,所以也只能存放8個位元位,所以也需要截斷,截斷後c 中儲存的位元位為:10000010
在進行列印時是以 %d 的形式即整數 int 的型別,此時需要32位位元位,這時就要對 c 進行整型提公升了。
因為c 的最高位是 1 所以在最高位前面補 1 即可,補夠32位,提公升後補碼為:11111111 11111111 11111111 10000010
將補碼轉化為原碼的形式列印出來,轉化後的原碼為 : 10000000 0 0000000 00000000 01111110 原碼首位是 0 時為正數,為 1 時為負數,此原碼對應的整數就為 -126
例題:
#include
intmain()
結果為:
此題也是同樣的道理:
整數 -129 的補碼為: 11111111 11111111 11111111 01111111
被截斷後為 01111111,
列印%d的形式時在進行整型提公升,截斷後最高位為 0 ,所以在最高位前面補 0 提公升後的補碼為: 00000000 00000000 00000000 01111111
因為補碼的最前面的一位數為0 ,所以是正數,正數的原碼 反碼 補碼相同,即將補碼轉化的原碼為: 00000000 00000000 00000000 01111111 此原碼對應的值就是 127
python pickle的使用詳解及樣例
pickle模組是以二進位制的形式序列化後儲存到檔案中 儲存檔案的字尾為 pkl 不能直接開啟進行預覽。而python的另乙個序列化標準模組json,則是human readable的,可以直接開啟檢視 例如在notepad 中檢視 import pickle a with open text.tx...
C語言的表示式求值問題(整型提公升)
表示式求值的順序一部分是由操作符的優先順序和結合性決定。同樣,有些表示式的運算元在求值的過程中可能需要轉換為其他型別。隱式型別轉換 c的整型算術運算總是至少以預設整型型別的精度來進行的。為了獲得這個精度,表示式中的字元和短整型運算元在使用之前被轉換為普通整型,這種轉換稱為整型提公升。為什麼要整型提公...
佇列的基本操作(C語言) 以整型為例
佇列一般用鏈式結構。所謂的鏈式結構的佇列,就是在單鏈表的基礎上進行再封裝,從而使其成為佇列。其用法類似與單鏈表,也與棧相似,但是它與棧不同的是它遵循與棧相反的 先進先出 原則。include include typedef struct qnode 建立乙個單鏈表結點 qnode,queueprt ...